Якщо вам потрібно просто протестувати деякі конкретні методи, не торкаючись жодної реферати, ви можете скористатися CALLS_REAL_METHODS
(див . Відповідь Мортена ), але якщо конкретний метод, що тестується, викликає деякі реферати, або непроведені методи інтерфейсу, це не буде працювати - Mockito скаржиться на "Неможливо викликати реальний метод в інтерфейсі Java".
(Так, це хитра конструкція, але деякі рамки, наприклад, Tapestry 4, накладають на це силу.)
Вирішення цього способу полягає в тому, щоб змінити цей підхід - використовувати звичайну макетну поведінку (тобто, все знущається / заглух) і використовувати doCallRealMethod()
для явного виклику конкретного методу, який перевіряється. Напр
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();
}
}
Оновлено, щоб додати:
Для недійсних методів потрібно використовувати thenCallRealMethod()
замість них, наприклад:
when(myInstance.myNonVoidMethod(someArgument)).thenCallRealMethod();
Інакше Mockito поскаржиться на "Незакінчене заглушка виявлена".
SomeAbstract spy = spy(SomeAbstract.class);