2017-01-20 8 views
5

मैं अपनी व्यावसायिक सेवा का परीक्षण करने के लिए मॉकिटो का उपयोग कर रहा हूं, और यह एक उपयोगिता का उपयोग करता है जिसे मैं नकल करना चाहता हूं। विभिन्न तर्कों के साथ उपयोगिता के लिए प्रत्येक सेवा विधि में कम-से-कम 2-3 कॉल हैं।विभिन्न पैरामीटर के साथ नकली विधि

क्या एक ही विधि के लिए एकाधिक when(...).thenReturn(...) का उपयोग करने के लिए कोई अनुशंसित तरीका है लेकिन विभिन्न तर्क?

मैं भी any() मार्चर का उपयोग करना चाहता हूं। क्या यह संभव है?

अद्यतन: नमूना कोड।

@Test 
public void myTest() { 
    when(service.foo(any(), new ARequest(1, "A"))).thenReturn(new AResponse(1, "passed")); 
    when(service.foo(any(), new ARequest(2, "2A"))).thenReturn(new AResponse(2, "passed")); 
    when(service.foo(any(), new BRequest(1, "B"))).thenReturn(new BResponse(112, "passed")); 

    c.execute(); 
} 

public class ClassUnderTest { 
    Service service = new Service(); 
    public void execute() { 
    AResponse ar = (AResponse) service.foo("A1", new ARequest(1, "A")); 
    AResponse ar2 = (AResponse) service.foo("A2", new ARequest(2, "2A")); 
    BResponse br = (BResponse) service.foo("B1", new BRequest(1, "B")); 
    } 
} 

public class Service { 
    public Object foo(String firstArgument, Object obj) { 
    return null; //return something 
    } 
} 
+0

यह विरोधाभासी है। यदि आप 'कोई() 'निर्दिष्ट करते हैं, तो आपका मतलब है, लेकिन साथ ही आप नहीं करते हैं?! बस उचित matchers का उपयोग करें। – SpaceTrucker

+0

कृपया मुझे कुछ तरीकों की सलाह दें। मैं पैरामीटर में से किसी एक के लिए ऑब्जेक्ट नहीं बना सकता, इसलिए मैं किसी भी() का उपयोग करता हूं लेकिन बदनाम रूप से मैं काम नहीं करता। मेरा कहना था कि मैं कुछ भी करना चाहता हूं। –

उत्तर

8

एक ही तरीका आपके तर्कों पर बहुत ही सीमित होने से बचने के लिए हो सकता है ताकि सभी अपेक्षित परिणामों को केवल एक thenReturn कॉल के साथ प्रदान किया जा सके।

public String foo(String firstArgument, Object obj) { 
    return "Something"; 
} 

फिर आप के रूप में कई परिणाम उपलब्ध कराने के द्वारा यह नकली सकता है के रूप में आप नीचे की तरह हैं:: foo को

// Mock the call of foo of any String to provide 3 results 
when(mock.foo(anyString(), anyObject())).thenReturn("val1", "val2", "val3"); 

कॉल के साथ

उदाहरण के लिए मान लीजिए कि मैं इस विधि नकली करना चाहते हैं कोई पैरामीटर क्रमशः "val1", "val2" प्रदान करेगा, फिर किसी भी बाद की कॉल "val3" प्रदान करेगी।


मामले में आप पारित कर दिया मूल्यों के बारे में देखभाल करना है लेकिन कॉल अनुक्रम पर निर्भर रहना आप thenAnswer उपयोग कर सकते हैं एक जवाब है कि जैसे आप वर्तमान में है, लेकिन 3 अलग thenReturn साथ दूसरा तर्क के साथ मेल खाता है प्रदान करने के लिए नहीं करना चाहती।

when(mock.foo(anyString(), anyObject())).thenAnswer(
    invocation -> { 
     Object argument = invocation.getArguments()[1]; 
     if (argument.equals(new ARequest(1, "A"))) { 
      return new AResponse(1, "passed"); 
     } else if (argument.equals(new ARequest(2, "2A"))) { 
      return new AResponse(2, "passed"); 
     } else if (argument.equals(new BRequest(1, "B"))) { 
      return new BResponse(112, "passed"); 
     } 
     throw new InvalidUseOfMatchersException(
      String.format("Argument %s does not match", argument) 
     ); 
    } 
); 
+0

@ZeeshanBilal क्यों? यदि तर्क बराबर नहीं हैं तो क्या आप विफलताओं को प्राप्त करना चाहते हैं? –

+0

क्योंकि मेरी सेवा कार्यान्वयन में, पैरामीटर के विभिन्न संयोजनों की संख्या की संभावना है।लेकिन मैं केवल विशिष्ट तर्कों के साथ आगे बढ़ना चाहता हूं। मुझे लगता है कि यह सुनिश्चित करने का तरीका है कि आंतरिक कदम ठीक से निष्पादित किए गए हैं। –

+0

यदि ऐसा है तो मुझे विश्वास नहीं है कि आप वर्तमान में क्या करते हैं उससे बेहतर कर सकते हैं –

0

मुझे लगता है: "अनुशंसित" तरीका वह होगा जो आपके लिए काम करता है; और यह कम से कम कोडिंग प्रयासों के साथ आता है।

आपको उन परीक्षणों को प्रदान करना होगा जो आपके परीक्षण को करने के लिए आवश्यक हैं जो इसे करना है। उसके आसपास कोई रास्ता नहीं है।

यदि आप वास्तव में उपयोग किए गए तर्कों की परवाह करते हैं, तो आपको उन्हें तदनुसार निर्दिष्ट करना होगा। अगर आपको परवाह नहीं है; any() का उपयोग करें।

+0

मैं भी 'किसी भी() 'मार्चर के साथ-साथ अंदर भी उपयोग करना चाहता हूं। क्या यह संभव है? –

+0

क्षमा करें, "अंदर" के साथ आपका क्या मतलब है? –

0

eq() का उपयोग करके तर्कों का मिलान करने का उचित तरीका होगा, लेकिन यदि आप ऐसा नहीं करना चाहते हैं, तो आप केवल एकाधिक रिटर्न मान रिकॉर्ड कर सकते हैं।

when(someService.doSomething(any(SomeParam.class))).thenReturn(
    firstReturnValue, secondReturnValue, thirdReturnValue 
); 

अब पहली आह्वान के बाद thirdValuefirstValue, दूसरी secondValue और सभी वापस आ जाएगी।

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