Nếu bạn chỉ cần thử nghiệm một số phương pháp cụ thể mà không cần chạm vào bất kỳ tóm tắt nào, bạn có thể sử dụng CALLS_REAL_METHODS
(xem câu trả lời của Morten ), nhưng nếu phương pháp cụ thể trong thử nghiệm gọi một số tóm tắt hoặc phương thức giao diện chưa được thực hiện, thì điều này sẽ không hiệu quả - Mockito sẽ phàn nàn "Không thể gọi phương thức thực trên giao diện java."
(Vâng, đó là một thiết kế tệ hại, nhưng một số khung, ví dụ Tapestry 4, loại lực lượng này đối với bạn.)
Cách giải quyết là đảo ngược cách tiếp cận này - sử dụng hành vi giả thông thường (nghĩa là mọi thứ bị chế giễu / sơ khai) và sử dụng doCallRealMethod()
để gọi một cách rõ ràng phương pháp cụ thể đang được thử nghiệm. Ví dụ
public abstract class MyClass {
@SomeDependencyInjectionOrSomething
public abstract MyDependency getDependency();
public void myMethod() {
MyDependency dep = getDependency();
dep.doSomething();
}
}
public class MyClassTest {
@Test
public void myMethodDoesSomethingWithDependency() {
MyDependency theDependency = mock(MyDependency.class);
MyClass myInstance = mock(MyClass.class);
// can't do this with CALLS_REAL_METHODS
when(myInstance.getDependency()).thenReturn(theDependency);
doCallRealMethod().when(myInstance).myMethod();
myInstance.myMethod();
verify(theDependency, times(1)).doSomething();
}
}
Cập nhật để thêm:
Đối với các phương thức không trống, bạn sẽ cần sử dụng thenCallRealMethod()
thay thế, ví dụ:
when(myInstance.myNonVoidMethod(someArgument)).thenCallRealMethod();
Nếu không, Mockito sẽ phàn nàn "Phát hiện chưa hoàn thành."
SomeAbstract spy = spy(SomeAbstract.class);