2010-09-21 14 views
75

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

@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 

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

उत्तर

115

List के लिए जावा एपीआई देखें। Get (int) विधि केवल इंडेक्सऑटऑफबाउंड अपवाद को फेंकने के लिए घोषित किया जाता है जो रनटाइम अपवाद को बढ़ाता है। आप मॉकिटो को एक अपवाद फेंकने के लिए कहने की कोशिश कर रहे हैं जो उस विशेष विधि कॉल द्वारा फेंकने के लिए मान्य नहीं है।

आगे स्पष्टीकरण के लिए। सूची इंटरफ़ेस प्राप्त() विधि से एक चेक अपवाद को फेंकने के लिए प्रदान नहीं करता है और यही कारण है कि मॉकिटो विफल हो रहा है। जब आप मॉकिट सूची बनाते हैं, तो Mockito List.class की परिभाषा का उपयोग करके अपने नकली बनाता है। जिस व्यवहार को आप when(list.get(0)).thenThrow(new SomeException()) के साथ निर्दिष्ट कर रहे हैं वह List.class में विधि हस्ताक्षर से मेल नहीं खाता है, इसलिए मॉकिटो विफल हो जाता है। यदि आप वास्तव में ऐसा करना चाहते हैं, तो Mockito को new RunTimeException() फेंक दें या new ArrayIndexOutOfBoundsException() को बेहतर फेंक दें क्योंकि एपीआई निर्दिष्ट करता है कि यह एकमात्र मान्य अपवाद फेंक दिया जाना है।

+0

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

+2

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

+1

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

2

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

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

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

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

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