जवाबों:
कुछ मामले जहां मुझे उपयोगी लगे हैं:
try{ // do stuff... fail("Exception not thrown"); }catch(Exception e){ assertTrue(e.hasSomeFlag()); }
ध्यान दें:
JUnit4 के बाद से, यह परीक्षण करने के लिए अधिक सुरुचिपूर्ण तरीका है कि एक अपवाद को फेंक दिया जा रहा है: एनोटेशन का उपयोग करें @Test(expected=IndexOutOfBoundsException.class)
हालांकि, यह काम नहीं करेगा यदि आप अपवाद का निरीक्षण करना चाहते हैं, तो आपको अभी भी आवश्यकता है fail()
।
मुझे लगता है कि सामान्य उपयोग का मामला इसे कॉल करना है जब कोई अपवाद नकारात्मक परीक्षण में नहीं फेंका गया था।
निम्नलिखित छद्म कोड जैसा कुछ:
test_addNilThrowsNullPointerException()
{
try {
foo.add(NIL); // we expect a NullPointerException here
fail("No NullPointerException"); // cause the test to fail if we reach this
} catch (NullNullPointerException e) {
// OK got the expected exception
}
}
मैंने इसका उपयोग उस मामले में किया है, जहाँ मेरे @Before विधि में कुछ गड़बड़ हो गई होगी।
public Object obj;
@Before
public void setUp() {
// Do some set up
obj = new Object();
}
@Test
public void testObjectManipulation() {
if(obj == null) {
fail("obj should not be null");
}
// Do some other valuable testing
}
@Before
विधि सफल हुई, तो संभवत: इसे सीधे उस पद्धति में जाँचना बेहतर होगा। एक बोनस के रूप में, कम से कम JUnit और TestNG भी @Before
/ @After
विधियों से त्रुटियों के लिए एक अलग विफलता की रिपोर्ट करेंगे , ताकि यह देख सकें कि समस्या परीक्षण में ही नहीं थी।
इस तरह मैं फेल पद्धति का उपयोग करता हूं।
तीन राज्य हैं जो आपके परीक्षण के मामले को समाप्त कर सकते हैं
इरादा (नकारात्मक परीक्षण मामलों के विपरीत जो अपवाद होने की उम्मीद करते हैं)।
यदि आप ग्रहण का उपयोग कर रहे हैं तो तीन राज्यों को क्रमशः एक हरे, नीले और लाल मार्कर द्वारा इंगित किया जाता है।
मैं तीसरे परिदृश्य के लिए असफल संचालन का उपयोग करता हूं।
उदाहरण: सार्वजनिक इंटेगर ऐड (पूर्णांक ए, इंटेगर बी) {रिटर्न न्यू इंटेगर (a.intValue () + b.intValue ())}
fail()
।
उदाहरण के लिए, मैं fail()
उन परीक्षणों को इंगित करने के लिए उपयोग करता हूं जो अभी तक समाप्त नहीं हुए हैं (ऐसा होता है); अन्यथा, वे सफल के रूप में दिखाएंगे।
यह शायद इस तथ्य के कारण है कि मैं कुछ प्रकार की अपूर्ण () कार्यक्षमता से अनजान हूं, जो NUnit में मौजूद है।
समवर्ती और / या अतुल्यकालिक सेटिंग्स में, आप यह सत्यापित करना चाह सकते हैं कि कुछ विधियाँ (जैसे प्रतिनिधियों, ईवेंट श्रोताओं, प्रतिक्रिया संचालकों, आप इसे नाम देते हैं) को नहीं कहा जाता है। एक तरफ चौंका देने वाला ढांचा, आप fail()
परीक्षणों को विफल करने के लिए उन तरीकों से कॉल कर सकते हैं । ऐसे परिदृश्यों में समय-समय पर समाप्त होना एक और प्राकृतिक विफलता की स्थिति है।
उदाहरण के लिए:
final CountDownLatch latch = new CountDownLatch(1);
service.asyncCall(someParameter, new ResponseHandler<SomeType>() {
@Override
public void onSuccess(SomeType result) {
assertNotNull(result);
// Further test assertions on the result
latch.countDown();
}
@Override
public void onError(Exception e) {
fail(exception.getMessage());
latch.countDown();
}
});
if ( !latch.await(5, TimeUnit.SECONDS) ) {
fail("No response after 5s");
}
सबसे महत्वपूर्ण उपयोग मामला शायद अपवाद की जाँच है।
जबकि junit4 में जाँच के लिए अपेक्षित तत्व शामिल है यदि कोई अपवाद हुआ, तो ऐसा लगता है कि यह नए junit5 का हिस्सा नहीं है। इसका उपयोग fail()
करने का एक और लाभ यह expected
है कि आप इसे finally
टेस्ट-केस क्लीनअप की अनुमति के साथ जोड़ सकते हैं ।
dao.insert(obj);
try {
dao.insert(obj);
fail("No DuplicateKeyException thrown.");
} catch (DuplicateKeyException e) {
assertEquals("Error code doesn't match", 123, e.getErrorCode());
} finally {
//cleanup
dao.delete(obj);
}
जैसा कि एक अन्य टिप्पणी में उल्लेख किया गया है। जब तक आप इसे लागू नहीं कर सकते, तब तक इसे विफल करने के लिए एक परीक्षण होने के बाद यह उचित लगता है।