यदि आप DI या कारखानों का उपयोग नहीं करना चाहते हैं। आप अपनी कक्षा को थोड़ा मुश्किल तरीके से रिफ्लेक्टर कर सकते हैं:
public class Foo {
private Bar bar;
public void foo(Bar bar){
this.bar = (bar != null) ? bar : new Bar();
bar.someMethod();
this.bar = null; // for simulating local scope
}
}
और आपका परीक्षण वर्ग:
@RunWith(MockitoJUnitRunner.class)
public class FooTest {
@Mock Bar barMock;
Foo foo;
@Test
public void testFoo() {
foo = new Foo();
foo.foo(barMock);
verify(barMock, times(1)).someMethod();
}
}
तब जो वर्ग आपके फू विधि को बुला रहा है, वह इसे इस तरह करेगा:
public class thirdClass {
public void someOtherMethod() {
Foo myFoo = new Foo();
myFoo.foo(null);
}
}
जैसा कि आप देख सकते हैं कि विधि को इस तरह से कॉल करते समय, आपको किसी अन्य वर्ग में बार क्लास को आयात करने की आवश्यकता नहीं है जो आपके फू विधि को बुला रहा है जो शायद आप चाहते हैं।
बेशक नकारात्मक पक्ष यह है कि आप कॉलर को बार ऑब्जेक्ट सेट करने की अनुमति दे रहे हैं।
आशा है ये मदद करेगा।