2012-11-05 24 views
49

मैं एक अपेक्षित अपवाद के साथ एक विधि का परीक्षण कर रहा हूं। मुझे यह भी सत्यापित करने की आवश्यकता है कि अपवाद फेंकने के बाद कुछ क्लीनअप कोड (मॉक ऑब्जेक्ट पर) कहा जाता था, लेकिन ऐसा लगता है कि सत्यापन को अनदेखा किया जा रहा है। कोड यहाँ है। मैं अपेक्षित अपवाद को सत्यापित करने के लिए जूनिट ExpectedExceptionRule का उपयोग कर रहा हूं।मॉकिटो अपवाद के बाद सत्यापित करें जूनिट 4.10

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

@Test 
public void testExpectedException() 
{ 
    MockedObject mockObj = mock(MockedObj.class); 
    MySubject subject = new MySubject(mockedObj); 
    expectedEx.expect(MyException.class); 
    expectedEx.expectMessage("My exception message."); 
    subject.someMethodThrowingException(); 
    verify(mockObj). 
     someCleanup(eq(...)); 
} 

ऐसा लगता है कि verify पूरी तरह से अनदेखा किया जा रहा है। इससे कोई फर्क नहीं पड़ता कि मैंने verify में किस विधि को रखा है, मेरा परीक्षण गुजर रहा है, जो मैं नहीं चाहता हूं।

कोई विचार क्यों खुशहाल है?

उत्तर

51

ExpectedException द्वारा JUnit @Rule के माध्यम से एक प्रयास-पकड़ ब्लॉक में काम करता है। जब आपका कोड अपवाद फेंकता है, तो यह निकटतम प्रयास/पकड़ में ढेर तक जाता है, जो अपेक्षित अपवाद उदाहरण में होता है (जो जांचता है कि यह अपवाद है जिसे आप उम्मीद कर रहे हैं)।

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

तकनीकी रूप से, आप अंततः ब्लॉक में सत्यापन कर सकते हैं, लेकिन यह a bad habit हो सकता है। किसी भी मामले में यह उपयोगी ExpectedException संदेश निगलने की संभावना है, क्योंकि यह अपेक्षित अपवाद नियम से पहले इसे चला सकता है।

तुम सच में अपवाद के बाद राज्य सत्यापित करने के लिए, एक प्रति विधि के आधार पर की जरूरत है, तो आप हमेशा यह मुहावरा के लिए वापस लौटने कर सकते हैं:

@Test 
public void testExpectedException() 
{ 
    MockedObject mockObj = mock(MockedObj.class); 
    MySubject subject = new MySubject(mockedObj); 
    try { 
    subject.someMethodThrowingException(); 
    fail("Expected MyException."); 
    } catch (MyException expected) { 
    assertEquals("My exception message.", expected.getMessage()); 
    } 
    verify(mockObj).someCleanup(eq(...)); 
} 

अद्यतन: जावा 8 के लैम्ब्डा भाव के साथ, आप कर सकते हैं कोशिश करें ब्लॉक concisely enough to be useful में एक कार्यात्मक इंटरफेस कॉल लपेटें। मुझे लगता है कि इस वाक्यविन्यास के लिए समर्थन कई मानक परीक्षण पुस्तकालयों में अपना रास्ता खोजेगा।

assertThrows(MyException.class, 
    () -> systemUnderTest.throwingMethod()); 
4

मैं अभी तक इस प्रयास नहीं किया है, लेकिन जेफ बोमन उत्कृष्ट जवाब के अलावा, आप के साथ ExpectedException नियम का उपयोग करने के विकल्प हो सकता है एक कोशिश ... अंत में निर्माण, अंत में अपने को सत्यापित बयान रखने ब्लॉक।

+0

साथ अधिक सुरुचिपूर्ण समाधान मेरे बीच पैरा की जाँच करें ... मुझे लगता है कि काम करेगा लेकिन ExpectedException संदेश निगल जाएगा। हालांकि प्रशंसा के लिए धन्यवाद! –

+0

मिस्ड कि - शायद सही है। –

+3

अंततः मेरे लिए ठीक काम करता है - सत्यापित निष्पादित करता है और अभी भी अपेक्षित अपवाद का पता लगाता है और यह संदेश है –

6

catch-exception

@Test 
public void testExpectedException() 
{ 
    MockedObject mockObj = mock(MockedObject.class); 
    MySubject subject = new MySubject(mockObj); 

    when(subject).someMethodThrowingException(); 

    then(caughtException()) 
      .isInstanceOf(MyException.class) 
      .hasMessage("My exception message."); 

    verify(mockObj).someCleanup(eq(...)); 
}