मुझे लगता है कि इस प्रश्न को एक अद्यतन उत्तर की आवश्यकता है, क्योंकि यहाँ अधिकांश उत्तर काफी पुराने हैं।
सबसे पहले ओपी के सवाल:
मुझे लगता है कि इसकी बहुत अच्छी तरह से स्वीकार की गई है कि JUnit में "अपेक्षित अतिशयोक्ति" अवधारणा को पेश करना एक बुरा कदम था, क्योंकि उस अपवाद को कहीं भी उठाया जा सकता है, और यह परीक्षा पास करेगा। यह काम करता है यदि आपका फेंक (और पर जोर देकर) बहुत ही डोमेन विशिष्ट अपवाद हैं, लेकिन मैं केवल उन प्रकार के अपवादों को फेंक देता हूं जब मैं कोड पर काम कर रहा हूं जो बिल्कुल बेदाग होने की जरूरत है, - अधिकतम एपीआईएस केवल अपवादों में निर्मित IllegalArgumentException
या जैसे IllegalStateException
। अगर दो कॉल करने से आपकी मेकिंग पॉजिटिवली इन अपवादों को फेंक सकती है, तो @ExpectedException
एनोटेशन आपके टेस्ट को ग्रीन-बार कर देगा भले ही इसकी गलत लाइन जो अपवाद को फेंके!
इस स्थिति के लिए मैंने एक वर्ग लिखा है जो मुझे यकीन है कि यहां कई अन्य लोगों ने लिखा है, यह एक assertThrows
विधि है:
public class Exceptions {
private Exceptions(){}
public static void assertThrows(Class<? extends Exception> expectedException, Runnable actionThatShouldThrow){
try{
actionThatShouldThrow.run();
fail("expected action to throw " + expectedException.getSimpleName() + " but it did not.");
}
catch(Exception e){
if ( ! expectedException.isInstance(e)) {
throw e;
}
}
}
}
यदि आप अपवाद को फेंक देते हैं, तो यह विधि केवल तभी वापस आती है, जब आप अपने परीक्षण में आगे की पुष्टि / सत्यापन कर सकते हैं।
जावा 8 सिंटैक्स के साथ आपका परीक्षण वास्तव में अच्छा लग रहा है। नीचे हमारे मॉडल पर सरल परीक्षणों में से एक है जो विधि का उपयोग करता है:
@Test
public void when_input_lower_bound_is_greater_than_upper_bound_axis_should_throw_illegal_arg() {
AxisRange range = new AxisRange(0,100);
Runnable act = () -> range.setLowerBound(200);
assertThrows(IllegalArgumentException.class, act);
}
ये परीक्षण थोड़े विस्मयकारी हैं क्योंकि "अधिनियम" कदम वास्तव में कोई कार्रवाई नहीं करता है, लेकिन मुझे लगता है कि अर्थ अभी भी काफी स्पष्ट है।
कैच-अपवाद नामक मावेन पर एक छोटा सा पुस्तकालय भी है जो इस बात को सत्यापित करने के लिए मॉकिटो-शैली सिंटैक्स का उपयोग करता है कि अपवादों को फेंक दिया जाए। यह बहुत अच्छा लग रहा है, लेकिन मैं गतिशील परदे के पीछे का प्रशंसक नहीं हूं। उस ने कहा, वहाँ वाक्यविन्यास इतना चालाक है कि वह लुभाता है:
List myList = new ArrayList();
catchException(myList).get(1);
assert caughtException() instanceof IndexOutOfBoundsException;
अंत में, इस स्थिति के लिए कि मैं इस धागे को प्राप्त करने के लिए भाग गया, परीक्षणों की अनदेखी करने का एक तरीका है अगर कुछ अनुमान मिलते हैं।
अभी मैं कुछ DLL प्राप्त करने पर काम कर रहा हूँ जिन्हें एक java देशी-लाइब्रेरी-लोडिंग-लाइब्रेरी के माध्यम से JNA कहा जाता है, लेकिन हमारा बिल्ड सर्वर ubuntu में है। मुझे JUnit परीक्षणों के साथ इस तरह के विकास को चलाने की कोशिश करना पसंद है - हालांकि, वे इस बिंदु पर "इकाइयों" से बहुत दूर हैं। यदि मैं एक स्थानीय मशीन पर हूं तो मैं परीक्षण करना चाहता हूं, लेकिन यदि हम जुबां पर हैं तो परीक्षण को अनदेखा करें। JUnit 4 में इसके लिए एक प्रावधान है, जिसे कहा जाता है Assume
:
@Test
public void when_asking_JNA_to_load_a_dll() throws URISyntaxException {
Assume.assumeFalse(BootstrappingUtilities.isCircleCI());
URL url = DLLTestFixture.class.getResource("USERDLL.dll");
String path = url.toURI().getPath();
path = path.substring(0, path.lastIndexOf("/"));
NativeLibrary.addSearchPath("USERDLL", path);
Object dll = Native.loadLibrary("USERDLL", NativeCallbacks.EmptyInterface.class);
assertThat(dll).isNotNull();
}