Bazı somut yöntemlerden bazılarına herhangi bir özete dokunmadan test etmeniz gerekirse, kullanabilirsiniz CALLS_REAL_METHODS
( Morten'in cevabına bakın ), ancak test edilen somut yöntem bazı özetleri veya uygulanmayan arayüz yöntemlerini çağırırsa, bu işe yaramaz. - Mockito şikayet edecek "Java arayüzü gerçek yöntem çağrılamaz."
(Evet, berbat bir tasarım, ancak bazı çerçeveler, örneğin Goblen 4, bunu size zorlar.)
Çözüm, bu yaklaşımı tersine çevirmektir - sıradan sahte davranışı kullanın (yani, her şey alay konusu / saplanmış) ve doCallRealMethod()
test edilen somut yöntemi açıkça çağırmak için kullanın . Örneğin
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();
}
}
Eklemek için güncellendi:
Geçersiz olmayan yöntemler için thenCallRealMethod()
bunun yerine kullanmanız gerekir , örneğin:
when(myInstance.myNonVoidMethod(someArgument)).thenCallRealMethod();
Aksi takdirde Mockito "Bitmemiş stubbing tespit edildi."
SomeAbstract spy = spy(SomeAbstract.class);