दिलचस्प पोस्ट
क्लिक करने योग्य / संपादन योग्य विजेट के साथ सूची दृश्य मोंगोज़ बनाम ऑब्जेक्ट नेस्टिंग स्क्रीन पर एक पॉपअप विंडो केंद्र? जब स्प्रिंग सिक्योरिटी का इस्तेमाल किया जाता है, तो बीन में मौजूदा यूज़रनेम (यानी सुरक्षा कंसोर्ट) की जानकारी प्राप्त करने का सही तरीका क्या है? क्यों एक संरचना उदाहरण से संपत्ति की निरंतर बाधाएं लेकिन कक्षा उदाहरण नहीं? मैं कैसे कन्वर्ट करने के लिए बाइट सी # में धारा? IOS में सभी संपर्क फ़ोन नंबर पुनर्प्राप्त करें मल्टीटास्क पैनल से एप्लिकेशन को हटाने पर अधिसूचना रद्द करें आईओएस 5 के साथ पीछे की तरफ से संगत रहते हुए आईओएस 6 में ऑटो लेआउट को सक्षम करना सूचियों और ट्यूपल्स के बीच अंतर क्या है? जावास्क्रिप्ट रेगेक्स लटका हुआ है (वी 8 का उपयोग कर) हेडर के साथ पिछले पृष्ठ पर वापस जाएं ("स्थान:"); PHP में पटरियों में एक समय क्षेत्र से दूसरे समय में कनवर्ट करें MySQL डेटाबेस का उपयोग केवल PHP का उपयोग करें सर्कल सीआई में com.android.tools.build:gradle:3.0.0-alpha1 नहीं मिल सका

कैसे mockito साथ शून्य तरीकों से नकली बनाने के लिए

शून्य वापसी प्रकार के साथ तरीकों को कैसे नकल करें?

मैंने एक ऑब्ज़र्वर पैटर्न लागू किया है लेकिन मैं इसे मोकीटो के साथ मजाक नहीं कर सकता क्योंकि मुझे नहीं पता कि कैसे

और मैंने इंटरनेट पर एक उदाहरण ढूंढने की कोशिश की, लेकिन सफल नहीं हुआ।

मेरा वर्ग ऐसा दिखता है

public class World { List<Listener> listeners; void addListener(Listener item) { listeners.add(item); } void doAction(Action goal,Object obj) { setState("i received"); goal.doAction(obj); setState("i finished"); } private string state; //setter getter state } public class WorldTest implements Listener { @Test public void word{ World w= mock(World.class); w.addListener(this); ... ... } } interface Listener { void doAction(); } 

प्रणाली नकली के साथ शुरू नहीं कर रहे हैं = (मैं उपर्युक्त प्रणाली स्थिति को दिखाना चाहता हूं। और उनके अनुसार तर्क दें।

वेब के समाधान से एकत्रित समाधान "कैसे mockito साथ शून्य तरीकों से नकली बनाने के लिए"

Mockito API डॉक्स पर एक नज़र डालें जैसा कि लिंक किए गए दस्तावेज़ में उल्लेख किया गया है (प्वाइंट # 12) आप किसी भी doThrow() , doAnswer() , doNothing() , doReturn() परिवार को Mockito फ़्रेमवर्क से तरीकों का उपयोग करने के लिए शून्य विधियों का नकली कर सकते हैं।

उदाहरण के लिए,

 Mockito.doThrow(new Exception()).when(instance).methodName(); 

या यदि आप इसे अनुवर्ती व्यवहार के साथ जोड़ना चाहते हैं,

 Mockito.doThrow(new Exception()).doNothing().when(instance).methodName(); 

यह setState(String s) हुए कि आप नीचे वर्ग के विश्व में सेटर setState(String s) का मजाक देख रहे हैं, कोड doAnswer का नकली करने के लिए doAnswer विधि का उपयोग करता है।

 World mockWorld = mock(World.class); doAnswer(new Answer<Void>() { public Void answer(InvocationOnMock invocation) { Object[] args = invocation.getArguments(); System.out.println("called with arguments: " + Arrays.toString(args)); return null; } }).when(mockWorld).setState(anyString()); 

मुझे लगता है कि मुझे उस प्रश्न का सरल उत्तर मिल गया है, सिर्फ एक ही विधि के लिए वास्तविक पद्धति को कॉल करने के लिए (भले ही इसकी शून्य वापसी हो) आप यह कर सकते हैं:

 Mockito.doCallRealMethod().when(<objectInstance>).<method>(); <objectInstance>.<method>(); 

या, आप उस वर्ग के सभी तरीकों के लिए वास्तविक पद्धति को कॉल कर सकते हैं:

 <Object> <objectInstance> = mock(<Object>.class, Mockito.CALLS_REAL_METHODS); 

तथाकथित समस्या का हल एक mock Mockito.mock (..) के बजाय एक spy Mockito.spy (…) का उपयोग करने के लिए है।

जासूस हमें आंशिक मजाक करने में सक्षम बनाता है मॉकिटो इस मामले में अच्छा है क्योंकि आपके पास कक्षा है जो पूर्ण नहीं है, इस तरह से आप इस कक्षा में कुछ जरूरी जगह का मज़ाक लेते हैं।

सतीश ने जो कहा, उसमें जोड़ना, जब आप टेस्ट को कॉल करने से रोकने के लिए एक शून्य विधि का नकली चाहते हैं, तो आप इस तरह एक Spy प्रयोग कर सकते हैं:

 World world = new World(); World spy = Mockito.spy(world); Mockito.doNothing().when(spy).methodToMock(); 

जब आप अपना परीक्षण चलाने के लिए चाहते हैं, तो सुनिश्चित करें कि आप टेस्ट ऑब्जेक्ट पर परीक्षा में विधि को कॉल करते हैं और world ऑब्जेक्ट पर नहीं। उदाहरण के लिए:

 assertEquals(0,spy.methodToTestThatShouldReturnZero()); 

सबसे पहले: आपको हमेशा नकली स्थिर आयात करना चाहिए, इस तरह से कोड अधिक पठनीय (और सहज) होगा:

 import static org.mockito.Mockito.*; 

आंशिक मजाक और बाकी मॉकिटो पर अभी भी मूल कार्यक्षमता रखने के लिए "जासूस" प्रदान करता है।

आप इसे निम्नानुसार उपयोग कर सकते हैं:

 private World world = spy(World.class); 

निष्पादित होने से एक विधि को खत्म करने के लिए आप ऐसा कुछ उपयोग कर सकते हैं:

 doNothing().when(someObject).someMethod(anyObject()); 

एक विधि के लिए कुछ कस्टम व्यवहार देने के लिए "जब" "फिर" के साथ उपयोग करें:

 doReturn("something").when(this.world).someMethod(anyObject()); 

अधिक उदाहरणों के लिए कृपया डॉक्टर में मॉकिटू नमूनों को ढूंढें।

नकली तरीके के साथ नकली तरीके कैसे नकल करें – दो विकल्प हैं:

  1. doAnswer – अगर हम कुछ करना चाहते हैं तो हम अपनी नकली शून्य विधि चाहते हैं (शून्य होने के बावजूद व्यवहार का नकली)
  2. doThrow – फिर Mockito.doThrow() यदि आप mocked void विधि से एक अपवाद फेंकना चाहते हैं

निम्नलिखित इसका उपयोग करने का एक उदाहरण है (आदर्श उपयोग नहीं बल्कि सिर्फ बुनियादी उपयोग को स्पष्ट करना चाहता था)।

 @Test public void testUpdate() { doAnswer(new Answer<Void>() { @Override public Void answer(InvocationOnMock invocation) throws Throwable { Object[] arguments = invocation.getArguments(); if (arguments != null && arguments.length > 1 && arguments[0] != null && arguments[1] != null) { Customer customer = (Customer) arguments[0]; String email = (String) arguments[1]; customer.setEmail(email); } return null; } }).when(daoMock).updateEmail(any(Customer.class), any(String.class)); // calling the method under test Customer customer = service.changeEmail("old@test.com", "new@test.com"); //some asserts assertThat(customer, is(notNullValue())); assertThat(customer.getEmail(), is(equalTo("new@test.com"))); } @Test(expected = RuntimeException.class) public void testUpdate_throwsException() { doThrow(RuntimeException.class).when(daoMock).updateEmail(any(Customer.class), any(String.class)); // calling the method under test Customer customer = service.changeEmail("old@test.com", "new@test.com"); } } 

आप अपने पोस्ट में मॉकिटो के साथ रहित तरीकों का नकली और परीक्षण कैसे कर सकते हैं, इसके बारे में अधिक जानकारी मिल सकती है मॉकिटो के साथ नकली कैसे करें (उदाहरणों के साथ एक व्यापक गाइड)

गुच्छा (कोई यमक इरादा) के लिए एक और जवाब जोड़ने …

यदि आप जासूसी का उपयोग नहीं करना चाहते हैं, तो आप को अप्रेस विधि पर कॉल करने की आवश्यकता है हालांकि, आपको जरूरी नहीं कि अपने स्वयं के जवाब को रोल करना पड़ता है। कई डिफ़ॉल्ट कार्यान्वयन हैं विशेषकर, कॉल रिआल्म विधि

व्यवहार में, ऐसा कुछ दिखता है:

 doAnswer(new CallsRealMethods()).when(mock) .voidMethod(any(SomeParamClass.class)); 

या:

 doAnswer(Answers.CALLS_REAL_METHODS.get()).when(mock) .voidMethod(any(SomeParamClass.class)); 

मुझे लगता है कि आपकी समस्याएं आपके परीक्षण संरचना के कारण हैं मुझे परीक्षा वर्ग में इंटरफेस को लागू करने की परंपरागत पद्धति के साथ मजाकिया बनाना मुश्किल हो गया है (जैसा आपने यहां किया है)।

यदि आप एक श्रव्य के रूप में श्रोता को कार्यान्वित करते हैं तो आप संपर्क की पुष्टि कर सकते हैं।

 Listener listener = mock(Listener.class); w.addListener(listener); world.doAction(..); verify(listener).doAction(); 

यह आपको संतुष्ट करना चाहिए कि 'विश्व' सही काम कर रहा है

@शैली: मेरे लिए काम करता है

 public class AssetChangeListenerImpl extends AbstractAssetChangeListener implements AssetChangeListener { @Override public void onChangeEvent(final EventMessage message) throws EventHubClientException { execute(message); } } } public class AbstractAssetChangeListener { protected void execute( final EventMessage message ) throws EventHubClientException { executor.execute( new PublishTask(getClient(), message) ); } } @RunWith(MockitoJUnitRunner.class) public class AssetChangeListenerTest extends AbstractAssetChangeListenerTest { public void testExecute() throws EventHubClientException { EventMessage message = createEventMesage(EventType.CREATE); assetChangeListener.execute(message); verify(assetChangeListener, times(1)).execute(message); } }