java - मॉकिटो के साथ शून्य तरीकों के लिए नकली कैसे करें




unit-testing mocking (7)

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

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);
} }

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

मैंने एक पर्यवेक्षक पैटर्न लागू किया लेकिन मैं इसे मॉकिटो के साथ नकल नहीं कर सकता क्योंकि मुझे नहीं पता कि कैसे।

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

मेरी कक्षा की तरह दिखता है

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();
}

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


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

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

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

assertEquals(0,spy.methodToTestThatShouldReturnZero());

जावा 8 में इसे थोड़ा क्लीनर बनाया जा सकता है, मान org.mockito.Mockito.doAnswer कि आपके पास org.mockito.Mockito.doAnswer लिए स्थिर आयात है:

doAnswer((i) -> {
  // Do stuff with i.getArguments() here
  return null;
}).when(*mock*).*method*(*methodArguments*);

return null; महत्वपूर्ण है और इसके बिना संकलन कुछ अस्पष्ट त्रुटियों के साथ असफल हो जाएगा क्योंकि यह doAnswer लिए उपयुक्त ओवरराइड नहीं doAnswer

उदाहरण के लिए एक ExecutorService जो निष्पादित करने के execute() पास किए गए किसी भी Runnable तुरंत execute() का उपयोग करके कार्यान्वित किया जा सकता है:

doAnswer((i) -> {
  ((Runnable) i.getArguments()[0]).run();
  return null;
}).when(executor).execute(any());

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

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


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

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

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

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

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

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

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());

मॉकिटो के साथ शून्य विधियों का नकल कैसे करें - दो विकल्प हैं:

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

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

@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("[email protected]", "[email protected]");

    //some asserts
    assertThat(customer, is(notNullValue()));
    assertThat(customer.getEmail(), is(equalTo("[email protected]")));

}

@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("[email protected]", "[email protected]");

}
}

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








mockito