2015-06-17 6 views
18

मैं उलझन में हूं कि उनके बीच क्या अंतर है, और किस मामले में चयन करना है। कुछ अंतर स्पष्ट हो सकते हैं, जैसे any और eq, लेकिन मैं बस सुनिश्चित करने के लिए उन सभी को शामिल कर रहा हूं।मॉकिटो मैचर्स isA, any, eq, और इसी के बीच क्या अंतर है?

मैं अपने मतभेदों के बारे में चिंता है क्योंकि मैं इस समस्या भर में आया था: मैं एक नियंत्रक वर्ग

public Response doSomething(@ResponseBody Request request) { 
    return someService.doSomething(request); 
} 

में इस पोस्ट विधि है और वह नियंत्रक पर एक इकाई परीक्षण प्रदर्शन करने के लिए करना चाहते हैं। मेरे पास दो संस्करण हैं। पहले एक इस

@Test 
public void testDoSomething() { 
    //initialize ObjectMapper mapper 
    //initialize Request req and Response res 

    when(someServiceMock.doSomething(req)).thenReturn(res); 

    Response actualRes = someController.doSomething(req); 
    assertThat(actualRes, is(res)); 
} 

की तरह, सरल है लेकिन मैं इस एक

@Test 
public void testDoSomething() { 
    //initialize ObjectMapper mapper 
    //initialize Request req and Response res 

    when(someServiceMock.doSomething(any(Request.class))).thenReturn(res); 

    mockMvc.perform(post("/do/something") 
      .contentType(MediaType.APPLICATION_JSON) 
      .content(mapper.writeValueAsString(req)) 
    ) 
      .andExpect(status().isOk()) 
      .andExpect(jsonPath("$message", is("done"))); 
} 

दोनों अच्छी तरह से काम की तरह, एक MockMvc दृष्टिकोण का उपयोग करना चाहता था। लेकिन मैं req प्राप्त करने के लिए मेरी someServiceMock.doSomething() MockMvc दृष्टिकोण में चाहता था, या कम से कम एक वस्तु की तरह सिर्फ पहली req रूप में एक ही चर मान (नहीं बस किसी भी Request वर्ग) है, और res लौटने कि,। मुझे पता है कि MockMvc दृष्टिकोण (या यह है?) का उपयोग करना असंभव है, क्योंकि वास्तविक कॉल में पारित वस्तु हमेशा नकली में पारित वस्तु से अलग होती है। क्या वैसे भी मैं इसे प्राप्त कर सकता हूं? या यह भी ऐसा करने के लिए समझ में आता है? या मुझे any(Request.class) का उपयोग करके संतुष्ट होना चाहिए? मैंने eq, same को आजमाया है, लेकिन वे सभी विफल हो गए हैं।

अग्रिम धन्यवाद। मुझे उम्मीद है कि मैंने खुद को अच्छी तरह से समझाया।

उत्तर

40
  • any() बिल्कुल कुछ भी नहीं जांचता है। मॉकिटो 1.x में, any(T.class) भी बिल्कुल कुछ भी जांचता है लेकिन आपको एक कास्ट भी बचाता है (जावा 8 से पहले)।

    This is due to change in Mockito 2.0 and beyond, जब any(T.class)isA अर्थ विज्ञान साझा करेंगे "किसी भी T" या ठीक से "किसी भी प्रकार T के कहने" मतलब करने के लिए। any() अभी भी बिल्कुल कुछ भी जांच नहीं पाएगा।

  • isA(T.class) यह जांच करता है कि instanceof T तर्क है, जिसका अर्थ है कि यह शून्य है।

  • same(obj) जांचता है कि तर्क obj जैसा ही उदाहरण है, जैसे कि arg == obj सत्य है।

  • eq(obj) जांच करता है कि तर्क obj के बराबर है equals विधि के अनुसार। यदि आप मैचर्स का उपयोग किये बिना वास्तविक मूल्यों में गुजरते हैं तो यह भी व्यवहार है।

    ध्यान दें कि जब तक equals ओवरराइड की गई है, तो आप डिफ़ॉल्ट Object.equals कार्यान्वयन देखेंगे, जो same(obj) रूप में एक ही व्यवहार होगा।

आप और अधिक सटीक अनुकूलन की जरूरत है, आप अपने खुद के विधेय के लिए एक एडाप्टर का उपयोग कर सकते हैं:

  • Mockito 1.x लिए, एक कस्टम Hamcrest Matcher<T> कि वास्तव में चयन करता है वस्तुओं आप की जरूरत के साथ argThat का उपयोग ।
  • Mockito 2.0 के लिए और परे, एक कस्टम org.mockito.ArgumentMatcher<T>, या MockitoHamcrest.argThat एक कस्टम Hamcrest Matcher<T> साथ साथ Matchers.argThat का उपयोग करें।
2

अपने Request.class औजार के बराबर होती है, तो आप eq() का उपयोग कर सकते हैं:

Bar bar = getBar(); 
when(fooService.fooFxn(eq(bar)).then... 

ऊपर जब पर सक्रिय कर

fooService.fooFxn(otherBar); 

अगर

otherBar.equals(bar); 

वैकल्पिक रूप से, यदि आप इनपू के किसी अन्य उप-समूह के लिए काम करने के लिए नकली करना चाहते हैं टी (उदाहरण के लिए, Bar.getBarLength()> 10 के साथ सभी बार्स), आप एक मैचर बना सकते हैं। मैं इस पद्धति भी अक्सर नहीं दिख रहा है, तो आम तौर पर मैं एक निजी वर्ग के रूप में Matcher बनाएँ:

when(fooService.fooFxn(argThat(new BarMatcher())).then... 

आशा है कि मदद करता है:

private static class BarMatcher extends BaseMatcher<Bar>{ 
...//constructors, descriptions, etc. 
    public boolean matches(Object otherBar){ 
    //Checks, casts, etc. 
    return otherBar.getBarLength()>10; 
    } 
} 

फिर आप इस मिलान के रूप में इस का प्रयोग करेंगे!

संबंधित मुद्दे