2013-05-16 8 views
21

में अपवादों को कैसे संभालना है मैंने कुछ विधि परीक्षण करने के लिए कुछ परीक्षण केस लिखे हैं। लेकिन कुछ तरीके एक अपवाद फेंक देते हैं। क्या मैं इसे सही तरीके से कर रहा हूं?जूनिट

private void testNumber(String word, int number) { 
    try { 
     assertEquals(word, service.convert(number)); 
    } catch (OutOfRangeNumberException e) { 
     Assert.fail("Test failed : " + e.getMessage()); 
    } 
} 

@Test 
public final void testZero() { 
    testNumber("zero", 0); 
} 

अगर मैं -45 गुजरती हैं, यह OutOfRangeException साथ विफल हो जाएगा, लेकिन मैं की तरह @Test(Expected...)

उत्तर

6

आप अपवाद परीक्षण विफल को पकड़ने के लिए की जरूरत नहीं है विशिष्ट अपवाद का परीक्षण करने में सक्षम नहीं हूँ। बस इसे जाने दें (throws घोषित करके) और यह वैसे भी असफल हो जाएगा।

एक और मामला तब होता है जब आप वास्तव में अपवाद की अपेक्षा करते हैं, तो आप कोशिश ब्लॉक के अंत में विफल हो जाते हैं।

उदाहरण के लिए: ही आपका कोड ठीक इनपुट मान्य है

@Test 
public void testInvalidNumber() { 
    try { 
     String dummy = service.convert(-1)); 
     Assert.fail("Fail! Method was expected to throw an exception because negative numbers are not supported.") 
    } catch (OutOfRangeException e) { 
     // expected 
    } 
} 

आप परीक्षण इस तरह का उपयोग कर सकते हैं की पुष्टि करने और एक उचित अपवाद के साथ अवैध इनपुट के प्रबंधन के लिए।

+1

ExpectedException उम्मीद अपवाद के लिए परीक्षण करने के लिए पसंदीदा तरीका है। –

+0

मैं सहमत हूं और मैंने पहले ही एरिक के जवाब को उखाड़ फेंक दिया है। – javadeveloper

+0

यदि आपको अपवाद की संरचना की जांच करने की आवश्यकता है तो आपको केवल अपेक्षित अपवाद की आवश्यकता है। उदाहरण के लिए, सीएमआईएसएक्सप्शन में उनके अंदर एक निर्दिष्ट दोष दोष सेट होना चाहिए। मुझे जांचने के लिए परीक्षण लिखना पड़ा, और मैंने उस उद्देश्य के लिए हैमक्रिस्ट मैचर्स का इस्तेमाल किया। यदि आप बस अपवाद की अपेक्षा करते हैं, तो @Test पर तर्क का उपयोग करें। –

15

कोशिश कैच ब्लॉक निकालें और अपने परीक्षा पद्धति को throws Exception जोड़ने जैसे:

@Test 
public final void testZero() throws Exception { 
    assertEquals("zero", service.convert(0)); 
} 

JUnit, ऐसा न करने की उम्मीद परीक्षण अपवाद फेंक देते हैं अपने को पकड़ने के लिए उन्हें सिर्फ उन्हें ठीक से रिपोर्ट करने में सक्षम किया जा रहा से JUnit रोक रहा है। इसके अलावा @Test एनोटेशन पर अपेक्षित संपत्ति काम करेगी।

45

एक अप्रत्याशित अपवाद एक परीक्षण विफलता है, इसलिए आपको न तो किसी को पकड़ना है और न ही पकड़ना है।

@Test 
public void canConvertStringsToDecimals() { 
    String str = "1.234"; 
    Assert.assertEquals(1.234, service.convert(str), 1.0e-4); 
} 

service तक फेंक नहीं है एक IllegalArgumentException क्योंकि str उस में एक दशमलव बिंदु यह है कि एक साधारण परीक्षण की विफलता हो जाएगा है।

@Test के वैकल्पिक expected तर्क द्वारा एक अपेक्षित अपवाद को संभाला जाना चाहिए।

@Test(expected=NullPointerException.class) 
public void cannotConvertNulls() { 
    service.convert(null); 
} 

तो प्रोग्रामर आलसी था और Exception फेंक दिया, या अगर वह service वापसी 0.0 था, परीक्षण असफल हो जायेगी। केवल NPE सफल होगा। ध्यान दें कि अपेक्षित अपवाद के उप-वर्ग भी काम करते हैं। यह NPE एस के लिए दुर्लभ है, लेकिन IOException एस और SQLException एस के साथ आम है।

दुर्लभ मामले में आप एक विशिष्ट अपवाद संदेश के लिए परीक्षण करना चाहते हैं, तो आप नए ExpectedException जुनीट @Rule का उपयोग करें।

@Rule 
public ExpectedException thrown= ExpectedException.none(); 
@Test 
public void messageIncludesErrantTemperature() { 
    thrown.expect(IllegalArgumentException.class); 
    thrown.expectMessage("-400"); // Tests that the message contains -400. 
    temperatureGauge.setTemperature(-400); 
} 

अब, जब तक setTemperature एक IAE फेंकता है और संदेश के तापमान उपयोगकर्ता सेट करने के लिए कोशिश कर रहा था होता है, परीक्षण विफल रहता है। इस नियम का उपयोग अधिक परिष्कृत तरीकों से किया जा सकता है।


आपका उदाहरण सबसे अच्छा द्वारा नियंत्रित किया जा सकता है:

private void testNumber(String word, int number) 
     throws OutOfRangeNumberException { 
    assertEquals(word, service.convert(number)); 
} 

@Test 
public final void testZero() 
     throws OutOfRangeNumberException { 
    testNumber("zero", 0); 
} 

आप testNumber इनलाइन कर सकते हैं; अब, यह ज्यादा मदद नहीं करता है। आप इसे एक पैरामीरिज्ड टेस्ट क्लास में बदल सकते हैं।

2

ऐसी कई रणनीतियां हैं जो आपके परीक्षणों में अपेक्षित अपवादों से निपटने के लिए खुली हैं। मुझे लगता है कि जुनीट एनोटेशन और कोशिश/पकड़ मुहावरे पहले से ही ऊपर उल्लेख किया गया है। मैं Lambda अभिव्यक्ति के जावा 8 विकल्प पर ध्यान आकर्षित करना चाहता हूं।

उदाहरण के लिए दिए गए:

class DummyService { 
public void someMethod() { 
    throw new RuntimeException("Runtime exception occurred"); 
} 

public void someOtherMethod(boolean b) { 
    throw new RuntimeException("Runtime exception occurred", 
      new IllegalStateException("Illegal state")); 
} 

}

आप ऐसा कर सकते हैं:

@Test 
public void verifiesCauseType() { 
    // lambda expression 
    assertThrown(() -> new DummyService().someOtherMethod(true)) 
      // assertions 
      .isInstanceOf(RuntimeException.class) 
      .hasMessage("Runtime exception occurred") 
      .hasCauseInstanceOf(IllegalStateException.class); 
} 

इस ब्लॉग जो उदाहरण के साथ विकल्पों में से सबसे को शामिल किया गया पर एक नजर डालें।

http://blog.codeleak.pl/2013/07/3-ways-of-handling-exceptions-in-junit.html

और यह एक और पूरी तरह से जावा 8 लैम्ब्डा विकल्प बताते हैं:

http://blog.codeleak.pl/2014/07/junit-testing-exception-with-java-8-and-lambda-expressions.html

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