यदि आपको किसी भी अमूर्त तत्व को छूने के बिना कुछ ठोस तरीकों का परीक्षण करने की आवश्यकता है, तो आप उपयोग कर सकते हैं CALLS_REAL_METHODS
( मोर्टन का उत्तर देखें ), लेकिन यदि परीक्षण के तहत ठोस विधि कुछ अमूर्त, या अनियोजित इंटरफ़ेस विधियों को बुलाती है, तो यह काम नहीं करेगा। - मॉकिटो शिकायत करेगा "जावा इंटरफ़ेस पर वास्तविक विधि नहीं कह सकता।"
(हाँ, यह एक घटिया डिजाइन है, लेकिन कुछ चौखटे, उदाहरण के लिए टेपेस्ट्री 4, यह आपके ऊपर एक प्रकार का बल है।)
वर्कअराउंड इस दृष्टिकोण को उल्टा करना है - साधारण नकली व्यवहार का उपयोग करें (यानी, सब कुछ नकली / स्टबड) और 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();
अन्यथा मॉकिटो शिकायत करेगा "अनफिनिश्ड स्टबिंग का पता चला।"
SomeAbstract spy = spy(SomeAbstract.class);