2013-07-18 6 views
7

JUnit के ExpectedException नियम के उपयोग के बारे में कोई प्रश्न है junit ExpectedException Rule JUnit से शुरू 4.7 एक इस तरह अपवाद परीक्षण कर सकते हैं (जो ज्यादा बेहतर तो @Test (उम्मीद = Exception.class है)) :एक अपेक्षित अपवाद नियम का उपयोग करके मैं एक परीक्षण के भीतर कई अपवादों का परीक्षण कैसे कर सकता हूं? के रूप में यहाँ का सुझाव दिया</p> <p>:

@Rule 
public ExpectedException exception = ExpectedException.none(); 

@Test 
public void testFailuresOfClass() { 
Foo foo = new Foo(); 
exception.expect(Exception.class); 
foo.doStuff(); 
} 

अब मुझे एक परीक्षण विधि में कई अपवादों का परीक्षण करने की आवश्यकता है और निम्नलिखित परीक्षण चलाने के बाद एक हरा बार मिला है और इस प्रकार हर परीक्षण पास हुआ।

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

exception.expect(IndexOutOfBoundsException.class); 
foo.doStuff(); 

//this is not tested anymore and if the first passes everything looks fine 
exception.expect(NullPointerException.class); 
foo.doStuff(null); 

exception.expect(MyOwnException.class); 
foo.doStuff(null,""); 

exception.expect(DomainException.class); 
foo.doOtherStuff(); 
} 

हालांकि कुछ समय बाद मुझे एहसास हुआ कि पहले चेक पास के बाद testmethod को छोड़ दिया गया है। यह कम से कम कहने के लिए संदिग्ध है। जूनिट 3 में यह आसानी से संभव था ... तो मेरा प्रश्न यहां है:

मैं अपेक्षित अपवाद नियम का उपयोग करके एक परीक्षण के भीतर कई अपवादों का परीक्षण कैसे कर सकता हूं?

+0

आप अभी भी जूनिट 3 तरीके का उपयोग कर सकते हैं, लेकिन @Test (अपेक्षित) और अपेक्षित अपवाद का उपयोग करना संभव नहीं है। –

+0

मुझे डर था ;-) – Lonzak

+1

यह बुरा नहीं है। आम तौर पर प्रति परीक्षण एक चीज का परीक्षण करना बेहतर होता है। ठीक है अगर आप परीक्षण करते हैं, तो एक ही परीक्षण में किसी सूची के लिए नल, आकार और सामग्री न कहें, लेकिन एक परीक्षण में दो वैचारिक विभिन्न चीजों का परीक्षण न करें। यह कम पठनीय है। यदि आप प्रति परीक्षण एक चीज का परीक्षण करते हैं, तो आप 'testException' की बजाय, आपके परीक्षण का वर्णन करने के लिए विधि नाम का उपयोग कर सकते हैं। –

उत्तर

6

संक्षिप्त उत्तर: आप नहीं कर सकते।

यदि पहला कॉल - foo.doStuff() - अपवाद फेंकता है, तो आप कभी भी foo.doStuff(null) तक नहीं पहुंचेंगे। क्या तुम सच में एक और केवल एक परीक्षण चाहते हैं

private Foo foo; 

@Before 
public void setUp() { 
foo = new Foo(); 
} 

@Test(expected = IndexOutOfBoundsException.class) 
public void noArgsShouldFail() { 
foo.doStuff(); 
} 

@Test(expected = NullPointerException.class) 
public void nullArgShouldFail() { 
foo.doStuff(null); 
} 

@Test(expected = MyOwnException.class) 
public void nullAndEmptyStringShouldFail() { 
foo.doStuff(null,""); 
} 

@Test(expected = DomainException.class) 
public void doOtherStuffShouldFail() { 
foo.doOtherStuff(); 
} 

, आप: आप कई में अपने परीक्षण को विभाजित करना होगा (और यह तुच्छ मामले के लिए मैं ExpectedException बिना सरल अंकन के लिए वापस जा प्रस्ताव चाहते हैं,) fail यदि कोई त्रुटि फेंक दिया जाता है, और चीजों को आप उम्मीद कर पकड़ कर सकते हैं:

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

try { 
    foo.doStuff(); 
    fail("doStuff() should not have succeeded"); 
} catch (IndexOutOfBoundsException expected) { 
    // This is what we want. 
} 
try { 
    foo.doStuff(null); 
    fail("doStuff(null) should not have succeeded"); 
} catch (NullPointerException expected) { 
    // This is what we want. 
} 
// etc for other failure modes 
} 

यह हो जाता है काफी गंदा बहुत तेजी से है, हालांकि, और अगर पहली उम्मीद में विफल रहता है, तो आप नहीं है, तो कुछ और रूप में अच्छी तरह विफल रहता है देखेंगे, समस्या निवारण के दौरान जो परेशान हो सकता है।

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

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