2010-10-28 9 views
9

यह एक अवधारणात्मक बेवकूफ सवाल हो सकता है, लेकिन यह भी हो सकता है और चूंकि मैं अभी भी एक छात्र हूं, मुझे लगता है कि मुझे कोई समस्या नहीं है।जावा में अपवादों का दावा, कैसे?

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

पीएस मैं यूनिट टेस्ट लिखने के लिए जुनीट का उपयोग कर रहा हूं।

धन्यवाद।

उत्तर

29

अन्य पोस्टर के रूप में, सुझाव अगर आप JUnit4 उपयोग कर रहे हैं, तो आप एनोटेशन का उपयोग कर सकते हैं:,

@Test(expected=NumberFormatException.class);

हालांकि आप JUnit के एक पुराने संस्करण का उपयोग कर रहे हैं, या आप क्या करना चाहते है, तो एक ही परीक्षा पद्धति में एक से अधिक "अपवाद" कथनों, तो मानक मुहावरा है:

try { 
    formatNumber("notAnumber"); 
    fail("Expected NumberFormatException"); 
catch(NumberFormatException e) { 
    // no-op (pass) 
}
+0

यह एक अच्छा मुहावरे है जब आप अपवाद के बारे में चीजों का परीक्षण करना चाहते हैं, जैसे कि इसका संदेश, न केवल इसके अस्तित्व। – Yishai

+0

+1 - पुराने संस्करण के बारे में अच्छी बात। – Feanor

+0

+1 - इस प्रश्न का उत्तर दूसरे उदाहरण के बिना पूरा नहीं हुआ है। प्रैक्टिस में मुझे उल्लिखित कारणों के मुकाबले इस दृष्टिकोण के लिए अधिक बार डिफ़ॉल्ट करने की आवश्यकता है। – Synesso

2

उपयोग @Test (उम्मीद = IOException.class)

http://junit.sourceforge.net/doc/faq/faq.htm#tests_7

अगर आप एक उम्मीद अपवाद है यह ठीक है। परीक्षण विधि के अंत में एक Assert.fail() जोड़ने का एक वैकल्पिक रणनीति है। यदि कोई अपवाद नहीं फेंक दिया जाता है तो परीक्षण तदनुसार विफल हो जाएगा। जैसे

@Test 
public void testIOExceptionThrown() {  
    ftp.write(); // will throw IOException  
    fail(); 
} 
10

आप JUnit 4 का उपयोग कर रहे मानते हुए, एक तरह से कारण बनता है कि यह अपवाद के लिए अपने परीक्षण में विधि कहते हैं, और जुनीट एनोटेशन

@Test(expected = NumberFormatException.class) 

यदि अपवाद फेंक दिया गया है, तो परीक्षण पास हो जाएगा।

+1

+1 - फास्ट, लड़का – duffymo

+0

@ डफिमो: धन्यवाद! :) – Feanor

3

You can do this:

@Test(expected=IndexOutOfBoundsException.class) 
    public void testIndexOutOfBoundsException() { 
     ArrayList emptyList = new ArrayList(); 
     Object o = emptyList.get(0); 
    } 
1

अपने परीक्षा पद्धति से पहले यह व्याख्या जोड़ें; यह चाल करेगा।

@Test(expected = java.lang.NumberFormatException.class) 
public void testFooMethod() { 
    // Add code that will throw a NumberFormatException 
} 
8

आप JUnit 4.7 का उपयोग कर सकते हैं, तो आप ExpectedException नियम

@RunWith(JUnit4.class) 
public class FooTest { 
    @Rule 
    public ExpectedException exception = ExpectedException.none(); 

    @Test 
    public void doStuffThrowsIndexOutOfBoundsException() { 
    Foo foo = new Foo(); 

    exception.expect(IndexOutOfBoundsException.class); 
    exception.expectMessage("happened?"); 
    exception.expectMessage(startsWith("What")); 
    foo.doStuff(); 
    } 
} 

उपयोग कर सकते हैं यह @Test(expected=IndexOutOfBoundsException.class) तुलना में काफी बेहतर है, तो IndexOutOfBoundsException से पहले foo.doStuff()

देखें this article फेंक दिया जाता है क्योंकि परीक्षण असफल हो जायेगी है और the ExpectedException JavaDoc विवरण के लिए

+0

गहन तर्क और स्पष्टीकरण में मैं इस आलेख की सिफारिश करना चाहता हूं: http://monkeyisland.pl/2010/07/26/expected-exception-in-tests/ मेरे द्वारा +1। –

+0

+1 - मुझे यह अस्तित्व में नहीं पता था। –

+0

@ जोनाथन ड्रेपीऊ ने लिंक तय किया। मुझे बताने के लिए धन्यवाद! – NamshubWriter

0

एक समाधान जो मैं किसी विशेष जुनीट संस्करण से बंधे नहीं हैं catch-exception द्वारा प्रदान किया गया है जो जुनीट तंत्र में अंतर्निहित कुछ नुकसानों को दूर करने के लिए किया गया है।

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