2012-08-02 18 views
58

सफल होती है मैं नीचे (सरलीकृत) कोड का परीक्षण करने के लिए मॉकिटो का उपयोग करना चाहता हूं। मुझे नहीं पता कि मॉकिटो को पहली बार विफल होने के बारे में कैसे बताना है, फिर दूसरी बार सफल होना।अनुकरण पहला कॉल विफल रहता है, दूसरी कॉल

for(int i = 1; i < 3; i++) { 
    String ret = myMock.doTheCall(); 

    if("Success".equals(ret)) { 
    log.write("success"); 
    } else if (i < 3) { 
    log.write("failed, but I'll try again. attempt: " + i); 
    } else { 
    throw new FailedThreeTimesException(); 
    } 
} 

मैं सेटअप के साथ सफलता परीक्षण:

Mockito.when(myMock).doTheCall().thenReturn("Success"); 

और साथ विफलता परीक्षण:

Mockito.when(myMock).doTheCall().thenReturn("you failed"); 

लेकिन मैं कैसे जांच कर सकते हैं कि अगर यह एक बार (या दो बार) में विफल रहता है तो सफल होता है, यह ठीक है?

+0

किसी भी एक कैसे एक ही Jmockito का उपयोग कर प्राप्त करने के लिए व्याख्या कर सकते हैं – Bharat

उत्तर

130

the docs से:

कभी कभी हम अलग वापसी मान/एक ही विधि कॉल के लिए अपवाद के साथ ठूंठ की जरूरत है। विशिष्ट उपयोग केस इटरेटर का मज़ाक उड़ा सकता है। मॉकिटो के मूल संस्करण में सरल मॉकिंग को बढ़ावा देने के लिए यह सुविधा नहीं थी। उदाहरण के लिए, इटरेटर्स की बजाय कोई इटेबल या बस संग्रह का उपयोग कर सकता है। जो स्टबिंग के प्राकृतिक तरीके प्रदान करते हैं (उदाहरण के लिए वास्तविक संग्रह का उपयोग करना)। दुर्लभ स्थितियों में लगातार कॉल छोटा करते, उपयोगी हो सकता है, हालांकि:

when(mock.someMethod("some arg")) 
    .thenThrow(new RuntimeException()) 
    .thenReturn("foo"); 

//First call: throws runtime exception: 
mock.someMethod("some arg"); 

//Second call: prints "foo" 
System.out.println(mock.someMethod("some arg")); 
अपने मामले में

तो, आप चाहते हैं चाहते हैं:

when(myMock.doTheCall()) 
    .thenReturn("You failed") 
    .thenReturn("Success"); 
+0

अरे, कि भयानक है, धन्यवाद जॉन। – vikingsteve

+9

इसने मुझे अपने परिदृश्य के लिए सही दिशा (धन्यवाद) में इंगित किया जो शून्य विधियों से निपट रहा था - उस उदाहरण में आपको वैकल्पिक शैली का उपयोग करने की आवश्यकता है ... 'doThrow (new RuntimeException())। DoNothing()। जब (myMock) .doTheCall(); ' – haggisandchips

18

सबसे छोटा रास्ता आप क्या चाहते हैं लिखने के लिए

है
when(myMock.doTheCall()).thenReturn("Success", "you failed"); 

जब आप इस तरह के thenReturn पर एकाधिक तर्क प्रदान करते हैं, तो प्रत्येक तर्क का प्रयोग सबसे अधिक अंतिम तर्क के अलावा, एक बार में किया जाएगा, डब्ल्यू जितना आवश्यक हो उतना बार उपयोग किया जाता है। उदाहरण के लिए, इस मामले में, यदि आप 4 बार कॉल करते हैं, तो आपको "सफलता", "आप असफल", "आप असफल", "आप असफल" पाएंगे।

6

चूंकि इससे संबंधित टिप्पणी पढ़ने में मुश्किल होती है। मैं एक स्वरूपित उत्तर जोड़ दूंगा।

यदि आप इसे शून्य कार्य के साथ करने की कोशिश कर रहे हैं। जहां आप किसी व्यवहार से अपवाद चाहते हैं। तो फिर तुम कुछ इस तरह करना होगा:

Mockito.doThrow(new Exception("MESSAGE")) 
      .doNothing() 
      .when(mockService).method(eq()); 
0

this और this जवाब देने के लिए पर जोड़ने के लिए, आप भी एक पाश श्रृंखला के लिए मज़ाक उड़ाया कॉल का उपयोग कर सकते हैं। यह उपयोगी है अगर आपको एक ही चीज़ को कई बार नकल करने की ज़रूरत है, या कुछ पैटर्न में नकली है।

जैसे (एक दूर की कौड़ी यद्यपि):

import org.mockito.stubbing.Stubber; 

Stubber stubber = doThrow(new Exception("Exception!")); 
for (int i=0; i<10; i++) { 
    if (i%2 == 0) { 
     stubber.doNothing(); 
    } else { 
     stubber.doThrow(new Exception("Exception")); 
    } 
} 
stubber.when(myMockObject).someMethod(anyString()); 
संबंधित मुद्दे