Mockito के साथ नकली से अपवाद की जाँच करें


173

मैं एक विशेष विधि कहा जाता है जब मेरी एक नकली वस्तुओं की जाँच की अपवाद फेंकने की कोशिश कर रहा हूँ। मैं निम्नलिखित कोशिश कर रहा हूँ।

@Test(expectedExceptions = SomeException.class)
public void throwCheckedException() {
    List<String> list = mock(List.class);
    when(list.get(0)).thenThrow(new SomeException());
    String test = list.get(0);
}

public class SomeException extends Exception {
}

हालाँकि, यह निम्न त्रुटि उत्पन्न करता है।

org.testng.TestException: 
Expected exception com.testing.MockitoCheckedExceptions$SomeException but got org.mockito.exceptions.base.MockitoException: 
Checked exception is invalid for this method!
Invalid: com.testing.MockitoCheckedExceptions$SomeException

मॉकिटो प्रलेखन को देखते हुए , वे केवल उपयोग करते हैं RuntimeException, क्या मॉकिटो के साथ एक नकली वस्तु से चेक किए गए अपवादों को फेंकना संभव नहीं है?

जवाबों:


221

सूची के लिए जावा एपीआई की जाँच करें । विधि केवल फेंकने के लिए घोषित किया जाता है जो फैली हुई है । आप Mockito बताने के लिए एक अपवाद फेंकने के लिए प्रयास कर रहे हैं वह यह है कि उस विशेष विधि कॉल द्वारा फेंका जा करने के लिए मान्य नहीं
get(int index)IndexOutOfBoundExceptionRuntimeException
SomeException()

आगे स्पष्ट करने के लिए। सूची इंटरफेस एक जाँच अपवाद के लिए प्रदान नहीं करता है से फेंका जा करने के लिए विधि और यही वजह है Mockito विफल हो रहा है। जब आप मॉक लिस्ट बनाते हैं , तो मॉकिटो अपने मॉक को बनाने के लिए लिस्ट .class की परिभाषा का उपयोग करेगा ।
get(int index)

आपके द्वारा निर्दिष्ट व्यवहार when(list.get(0)).thenThrow(new SomeException()) सूची API में विधि हस्ताक्षर से मेल नहीं खाता है , क्योंकि get(int index)विधिSomeException() इसलिए नहीं फेंकती है कि मॉकिटो विफल रहता है।

यदि आप वास्तव में ऐसा करना चाहते हैं, तो मॉकिटो को फेंक दें new RuntimeException()या बेहतर फेंक दें new ArrayIndexOutOfBoundsException()क्योंकि एपीआई निर्दिष्ट करता है कि फेंका जाने वाला एकमात्र वैध अपवाद है।


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

2
अतिरिक्त: Mocktio शिकायत नहीं करेगा यदि आप बिना किसी थ्रोबल के एक तरीका अपनाते हैं, लेकिन आपको यह अपवाद भी मिलेगा
dwana

8
Kotliners के लिए: Kotlin ने अपवादों की जाँच नहीं की है, इसलिए आप सामान्य रूप से (फ़ंक्शन हस्ताक्षर में) घोषित नहीं कर सकते हैं कि फ़ंक्शन अपवाद को फेंकता है। हालाँकि, आप फ़ंक्शन को Throwsएनोटेशन के साथ संकलित कर सकते हैं ताकि कंपाइलर जावा कोड को बराबर जावा कोड में घोषित करने के लिए एक ही बायटेकोड उत्पन्न कर सके। अधिक जानकारी के लिए [यहाँ देखें] ( kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-throws/… )।
जावद सादिक़ज़ादेह 22

1
यह चेक मॉकिटो 2.11.0 (2.10.3 देखें) की रिलीज के बाद से लागू किया गया है ।
JJD

106

वर्कअराउंड एक willAnswer()विधि का उपयोग करना है।

उदाहरण के लिए निम्नलिखित काम करता है (और MockitoExceptionवास्तव में फेंक दिया जाता है, लेकिन Exceptionयहाँ आवश्यक के रूप में एक जाँच फेंकता नहीं है) का उपयोग कर BDDMockito:

given(someObj.someMethod(stringArg1)).willAnswer( invocation -> { throw new Exception("abc msg"); });

सादे Mockito के लिए doAnswerविधि का उपयोग करने के लिए बराबर होगा


9
या willAnswer( invocation -> { throw new Exception("abc msg"); }).given(someObj).someMethod(stringArg1);विधि के वापस आने पर उपयोग करें void
जुलिएन क्रोनग ने

9
या (जब someObj.someMethod (stringArg1)) का उपयोग करें। तो फिर Aswswer (मंगलाचरण -> {नया अपवाद फेंकें ("abc msg");});
दिमित्री अल्गाज़िन

महान वर्कअराउंड, धन्यवाद! कोटलिनर्स के लिए, जो (1) एक एक्सटेंशन फ़ंक्शन के रूप में मूल रूप से उपयोग करना चाहते हैं और (2) willThrow()सामान्य रूप से कई आर्गन पास करने में सक्षम हो सकते हैं , मैंने एक जिस्ट
डेविड फेरैंड

2
या doAnswerसेnhaarman.mockitokotlin2
hmac

6

ध्यान दें कि सामान्य रूप में, Mockito करता जब तक कि अपवाद संदेश हस्ताक्षर में घोषित किया जाता है जांचे हुए अपवादों फेंक देते हैं। मसलन, दिया गया

class BarException extends Exception {
  // this is a checked exception
}

interface Foo {
  Bar frob() throws BarException
}

यह लिखना कानूनी है:

Foo foo = mock(Foo.class);
when(foo.frob()).thenThrow(BarException.class)

हालाँकि, यदि आप जाँच किए गए अपवाद को विधि हस्ताक्षर में नहीं फेंकते हैं, जैसे

class QuxException extends Exception {
  // a different checked exception
}

Foo foo = mock(Foo.class);
when(foo.frob()).thenThrow(QuxException.class)

Mockito कुछ भ्रामक, सामान्य संदेश के साथ रनटाइम में विफल हो जाएगा:

Checked exception is invalid for this method!
Invalid: QuxException

यह आपको विश्वास दिला सकता है कि सामान्य रूप से जाँच किए गए अपवाद असमर्थित हैं, लेकिन वास्तव में मॉकिटो आपको केवल यह बताने की कोशिश कर रहा है कि यह जाँच अपवाद इस पद्धति के लिए मान्य नहीं है ।


5

कोटलिन के साथ समाधान है:

given(myObject.myCall()).willAnswer {
    throw IOException("Ooops")
}

जहां से दिया गया है

आयात org.mockito.BDDMockito.given


1

कोटलिन में यह मेरे लिए काम करता है:

when(list.get(0)).thenThrow(new ArrayIndexOutOfBoundsException());

नोट: अपवाद के अलावा कोई भी परिभाषित अपवाद फेंको ()


बस मैं जो चाह रहा था, उसे छोड़कर कोई अपवाद हो सकता हैException
नईम सरफराज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.