Se avete solo bisogno di testare alcuni dei metodi concreti senza toccare nessuna delle abstracts, è possibile utilizzare CALLS_REAL_METHODS
(vedi Morten's answer), ma se il metodo concreto in prova chiama alcuni degli abstract o metodi di interfaccia non implementati, questo non funzionerà - Mockito si lamenterà "Impossibile chiamare il metodo reale sull'interfaccia java".
(Sì, è un disegno schifoso, ma alcuni quadri, per esempio Tapestry 4, tipo di forza su di voi.)
La soluzione è quello di invertire questo approccio - utilizzare il comportamento finto ordinaria (vale a dire, tutto è deriso/stoppato) e utilizzare doCallRealMethod()
per richiamare esplicitamente il metodo concreto sotto test. Per esempio.
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();
}
}
aggiornato per aggiungere:
Per i metodi non-vuoto, è necessario utilizzare thenCallRealMethod()
invece, ad esempio:
when(myInstance.myNonVoidMethod(someArgument)).thenCallRealMethod();
Altrimenti Mockito si lamenta "Unfinished stub rilevato"
fonte
2011-09-12 23:14:51
A partire da Mockito [1.10.12] (http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#30), Mockito supporta direttamente le classi astratte di derisione/derisione: 'SomeAbstract spy = spy (SomeAbstract.class); ' – pesche