Si solo necesita probar algunos de los métodos concretos sin tocar ninguno de los resúmenes, puede usar CALLS_REAL_METHODS
(vea la respuesta de Morten ), pero si el método concreto bajo prueba llama a algunos de los resúmenes o métodos de interfaz no implementados, esto no funcionará - Mockito se quejará "No se puede llamar al método real en la interfaz de Java".
(Sí, es un diseño pésimo, pero algunos marcos, por ejemplo, Tapestry 4, lo fuerzan).
La solución alternativa es revertir este enfoque: use el comportamiento simulado ordinario (es decir, todo se burla / tropeza) y úselo doCallRealMethod()
para llamar explícitamente el método concreto bajo prueba. P.ej
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();
}
}
Actualizado para agregar:
Para los métodos no nulos, deberá usar thenCallRealMethod()
en su lugar, por ejemplo:
when(myInstance.myNonVoidMethod(someArgument)).thenCallRealMethod();
De lo contrario, Mockito se quejará "Se detectó un trozo inacabado".
SomeAbstract spy = spy(SomeAbstract.class);