Se você só precisar testar alguns dos métodos concretos sem tocar em nenhum dos resumos, poderá usá-lo CALLS_REAL_METHODS
(consulte a resposta de Morten ), mas se o método concreto em teste chamar alguns dos resumos ou métodos de interface não implementados, isso não funcionará. - Mockito reclamará "Não é possível chamar o método real na interface java".
(Sim, é um design ruim, mas algumas estruturas, como o Tapeçaria 4, meio que o impõem a você.)
A solução alternativa é reverter essa abordagem - use o comportamento de simulação comum (isto é, tudo é ridicularizado / stubbed) e use doCallRealMethod()
para chamar explicitamente o método concreto em teste. Por exemplo
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();
}
}
Atualizado para adicionar:
Para métodos não nulos, você precisará usar thenCallRealMethod()
, por exemplo:
when(myInstance.myNonVoidMethod(someArgument)).thenCallRealMethod();
Caso contrário, Mockito reclamará de "stubbing inacabado detectado".
SomeAbstract spy = spy(SomeAbstract.class);