Si sólo tiene que probar algunos de los métodos concretos sin tocar ninguno de los resúmenes, se puede utilizar CALLS_REAL_METHODS
(ver Morten's answer), pero si el método concreto que se está probando llama a algunos de los resúmenes o métodos de interfaz no implementadas, esta 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, la tapicería 4, tipo de fuerza en usted.)
La solución es revertir este enfoque - utilizar el comportamiento simulacro ordinaria (es decir, todo está burlado/aplastado) y use 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 añadir:
Para métodos no vacíos, tendrá que utilizar thenCallRealMethod()
lugar, por ejemplo:
when(myInstance.myNonVoidMethod(someArgument)).thenCallRealMethod();
De lo contrario Mockito se quejan de "sin terminar trozo detectado."
A partir de Mockito [1.10.12] (http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#30), Mockito admite clases abstractas de espionaje/burla directamente: 'SomeAbstract spy = espía (SomeAbstract.class); ' – pesche