Если вам просто нужно проверить некоторые из конкретных методов, не касаясь любой из тезисов, вы можете использовать CALLS_REAL_METHODS
(см Morten's answer), но если конкретный метод испытуемый называет некоторые из тезисов, или нереализованных методов интерфейса, это не будет работать - Mockito будет жаловаться «Невозможно вызвать реальный метод на java-интерфейсе».
(Да, это паршивый дизайн, но некоторые рамки, например Гобелен 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 будет жаловаться «Неоконченная обнаружено обрушение."
Начиная с Mockito [1.10.12] (http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#30), Mockito поддерживает шпионские/издевательские абстрактные классы напрямую: 'SomeAbstract spy = spy (SomeAbstract.class); ' – pesche