หากคุณเพียงแค่ต้องทดสอบวิธีที่เป็นรูปธรรมบางอย่างโดยไม่ต้องสัมผัสใด ๆ ของบทคัดย่อคุณสามารถใช้CALLS_REAL_METHODS
(ดูคำตอบของ Morten ) แต่ถ้าวิธีคอนกรีตภายใต้การทดสอบเรียกบางส่วนของบทคัดย่อหรือวิธีการอินเตอร์เฟซที่ไม่ได้ใช้งาน - Mockito จะบ่นว่า "ไม่สามารถเรียกใช้เมธอดจริงบนส่วนต่อประสาน Java"
(ใช่มันเป็นการออกแบบที่มีหมัด แต่มีกรอบบางอย่างเช่น Tapestry 4 ซึ่งบังคับให้คุณทำ)
วิธีแก้ปัญหาคือการย้อนกลับวิธีการนี้ - ใช้พฤติกรรมการเยาะเย้ยสามัญ (เช่นทุกสิ่งที่ถูกเยาะเย้ย / ถูก stubbed) และใช้doCallRealMethod()
เพื่อเรียกวิธีการที่เป็นรูปธรรมภายใต้การทดสอบอย่างชัดเจน เช่น
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();
}
}
อัปเดตเพื่อเพิ่ม:
สำหรับวิธีที่ไม่เป็นโมฆะคุณจะต้องใช้thenCallRealMethod()
แทนเช่น:
when(myInstance.myNonVoidMethod(someArgument)).thenCallRealMethod();
มิฉะนั้น Mockito จะบ่นว่า "ตรวจพบการขัดที่ยังไม่เสร็จ"
SomeAbstract spy = spy(SomeAbstract.class);