कैसे परीक्षण करें कि कोई अपवाद नहीं फेंका गया है?


238

मुझे पता है कि यह करने का एक तरीका होगा:

@Test
public void foo(){
   try{
      //execute code that you expect not to throw Exceptions.
   }
   catch(Exception e){
      fail("Should not have thrown any exception");
   }
}

क्या ऐसा करने का कोई क्लीनर तरीका है। (शायद जूनित का उपयोग कर रहे हैं @Rule?)


10
एक JUnit परीक्षण को असफल माना जाता है अगर यह एक अपवाद अपवाद के अलावा किसी भी अपवाद को फेंकता है। आमतौर पर कोई अपवाद अपेक्षित नहीं है।
रायलव्ड

JUnit में विफलता और त्रुटि के बीच कोई अंतर नहीं है? पहला मतलब है कि परीक्षा में फेल हो गया, दूसरे का मतलब है कि कुछ अप्रत्याशित हुआ।
विटुएल

जवाबों:


198

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

मैंने इस प्रश्न पर समय-समय पर रुचि देखी है इसलिए मैं थोड़ा विस्तार करूंगा।

इकाई परीक्षण के लिए पृष्ठभूमि

जब आप इकाई परीक्षण कर रहे होते हैं तो यह महत्वपूर्ण होता है कि आप स्वयं को परिभाषित करें कि आप किस इकाई को कार्य मानते हैं। मूल रूप से: आपके कोडबेस का एक निष्कर्षण जिसमें कई तरीके या कक्षाएं शामिल हो सकती हैं जो कार्यक्षमता के एक टुकड़े का प्रतिनिधित्व करती हैं।

या, द आर्ट ऑफ़ यूनिट टेस्टिंग में परिभाषित , रॉय ओशेरोव द्वारा दूसरा संस्करण , पृष्ठ 11:

एक इकाई परीक्षण कोड का एक स्वचालित टुकड़ा है जो परीक्षण की जा रही कार्य की इकाई को आमंत्रित करता है, और फिर उस इकाई के एकल अंतिम परिणाम के बारे में कुछ मान्यताओं की जांच करता है। एक इकाई परीक्षण लगभग हमेशा एक इकाई परीक्षण ढांचे का उपयोग करके लिखा जाता है। यह आसानी से लिखा जा सकता है और जल्दी से चलता है। यह भरोसेमंद, पठनीय और रखरखाव योग्य है। यह अपने परिणामों के अनुरूप है जब तक कि उत्पादन कोड नहीं बदला है।

यह महसूस करना महत्वपूर्ण है कि कार्य की एक इकाई आमतौर पर सिर्फ एक विधि नहीं होती है, बल्कि बहुत ही बुनियादी स्तर पर यह एक विधि होती है और इसके बाद अन्य इकाइयों द्वारा इसका निर्माण किया जाता है।

यहां छवि विवरण दर्ज करें

आदर्श रूप से आपके पास काम की प्रत्येक अलग इकाई के लिए एक परीक्षण विधि होनी चाहिए ताकि आप हमेशा यह देख सकें कि चीजें कहां गलत हो रही हैं। इस उदाहरण में एक मूल विधि है जिसे कहा जाता है getUserById()कि एक उपयोगकर्ता वापस आ जाएगा और कुल 3 यूनिट काम करता है।

कार्य की पहली इकाई को परीक्षण करना चाहिए कि वैध और अवैध इनपुट के मामले में वैध उपयोगकर्ता वापस किया जा रहा है या नहीं।
डेटासोर्स द्वारा फेंके जा रहे कुछ अपवादों को यहां संभाला जाना चाहिए: यदि कोई उपयोगकर्ता मौजूद नहीं है, तो एक परीक्षण होना चाहिए जो प्रदर्शित करता है कि उपयोगकर्ता को नहीं मिला जा सकता है तो एक अपवाद फेंक दिया जाता है। इसका एक नमूना ऐसा हो सकता है IllegalArgumentExceptionजिसे @Test(expected = IllegalArgumentException.class)एनोटेशन के साथ पकड़ा गया हो ।

एक बार जब आप काम की इस बुनियादी इकाई के लिए अपने सभी यूजेस को संभाल लेंगे, तो आप एक स्तर ऊपर ले जाते हैं। यहां आप बिल्कुल वैसा ही करते हैं, लेकिन आप केवल उन अपवादों को संभालते हैं जो वर्तमान स्तर से ठीक नीचे के स्तर से आते हैं। यह आपके परीक्षण कोड को अच्छी तरह से संरचित रखता है और आपको वास्तुकला के माध्यम से तेज़ी से चलाने की अनुमति देता है, जहां चीजें पूरी तरह से गलत हो जाती हैं, बजाय इसके कि सभी जगह आशा की जाए।

एक परीक्षण 'वैध और दोषपूर्ण इनपुट को संभालना

इस बिंदु पर यह स्पष्ट होना चाहिए कि हम इन अपवादों को कैसे संभालेंगे। इनपुट 2 प्रकार के होते हैं: वैध इनपुट और दोषपूर्ण इनपुट (इनपुट सख्त अर्थों में मान्य है, लेकिन यह सही नहीं है)।

जब आप वैध इनपुट के साथ काम करते हैं तो आप अंतर्निहित प्रत्याशा निर्धारित करते हैं कि आप जो भी परीक्षण लिखते हैं, वह काम करेगा।

इस तरह की विधि कॉल इस तरह दिख सकती है existingUserById_ShouldReturn_UserObject:। यदि यह विधि विफल हो जाती है (जैसे: एक अपवाद फेंक दिया जाता है) तो आप जानते हैं कि कुछ गलत हो गया है और आप खुदाई शुरू कर सकते हैं।

एक और परीक्षण ( nonExistingUserById_ShouldThrow_IllegalArgumentException) जोड़कर जो दोषपूर्ण इनपुट का उपयोग करता है और एक अपवाद की अपेक्षा करता है आप देख सकते हैं कि क्या आपका तरीका गलत इनपुट के लिए क्या करना चाहिए।

टी एल; डॉ

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

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


2
बात यह है कि मैं टीडीडी और उन सहयोगियों में से एक की कोशिश कर रहा हूं जिनका मैं उपयोग करता हूं, एक अपवाद फेंक रहा हूं। इसलिए मुझे इस तथ्य का परीक्षण करने की आवश्यकता है कि मैं सहयोगी द्वारा फेंके गए अपवाद का उपभोग कर रहा हूं
अंकित ढींगरा

6
क्या आप कह रहे हैं कि आपकी कार्यक्षमता किसी अपवाद की हैंडलिंग पर निर्भर है? यह एक कोड गंध है: अपवादों को शान्ति से आप मुद्दों को पकड़ने देते हैं; वे प्रवाह नियंत्रण के लिए उपयोग नहीं किए जाते हैं। यदि आप एक परिदृश्य का परीक्षण करना चाहते हैं जिसमें एक अपवाद फेंक दिया जाना चाहिए तो आपको expectedएनोटेशन का उपयोग करना चाहिए । यदि आप ऐसे परिदृश्य का परीक्षण करना चाहते हैं जहां आपका कोड विफल रहता है और आप यह देखना चाहते हैं कि क्या त्रुटि सही रूप से नियंत्रित की गई है: expectedयदि यह हल हो गई है, तो निर्धारित करने के लिए उपयोग करें और शायद इसका उपयोग करें।
जीरो वेनवेल

बात यह है कि मैं उस अपवाद से उबर नहीं पा रहा हूं जो सहयोगी में हुआ है और मैं जो कुछ भी करता हूं वह बस एक log.debug ("त्रुटि संदेश") का उपयोग करके समस्या है। इसलिए कैच ब्लॉक के एक भाग के रूप में कोई साइड इफेक्ट नहीं हो रहा है, जिस पर मैं संभवतः जोर दे सकता हूं।
अंकित ढींगरा

5
@JeroenVannevel यह परीक्षण करने के लिए पूरी तरह से मान्य है कि एक त्रुटि स्थिति जिसके कारण एक अपवाद को फेंक दिया जाता है, ठीक से नियंत्रित किया जाता है।
थोरबजोरन रावन एंडरसन

1
@dpk हाँ आप कर सकते हैं। आप throws IllegalArgumentExceptionअपने परीक्षण में जोड़ें । अंत में आप जो चाहते हैं, वह यह है कि अपवाद होने पर आपका परीक्षण लाल हो जाता है। अच्छा अंदाजा लगाए? आपको लिखने की आवश्यकता नहीं है fail()। जैसा @Jeroen Vannevel ने लिखा है: "यदि एक अपवाद को फेंक दिया जाता है तो परीक्षण स्वचालित रूप से विफल हो जाएगा।"
एमी वैन गेंस

132

मैं सोनारक्यूब के नियम "स्क्विड: S2699" के कारण इस पर लड़खड़ाया: "इस परीक्षण मामले में कम से कम एक जोर डालिए।"

मेरा एक साधारण परीक्षण था जिसका एकमात्र लक्ष्य अपवादों को फेंकने के बिना गुजरना था।

इस सरल कोड पर विचार करें:

public class Printer {

    public static void printLine(final String line) {
        System.out.println(line);
    }
}

इस पद्धति का परीक्षण करने के लिए किस तरह का जोर जोड़ा जा सकता है? ज़रूर, आप इसके चारों ओर एक कोशिश कर सकते हैं, लेकिन यह केवल कोड ब्लोट है।

इसका समाधान JUnit से ही आता है।

यदि कोई अपवाद नहीं फेंका गया है और आप इस व्यवहार को स्पष्ट रूप से बताना चाहते हैं, तो बस expectedनिम्न उदाहरण में जोड़ें :

@Test(expected = Test.None.class /* no exception expected */)
public void test_printLine() {
    Printer.printLine("line");
}

Test.None.class अपेक्षित मूल्य के लिए डिफ़ॉल्ट है।


30
मुझे लगता है कि यह सबसे अच्छा जवाब है। स्वीकृत उत्तर महान है, और लेखक कोड गंध को इंगित करने के लिए सही है। हालाँकि उन्होंने वास्तव में विशिष्ट प्रश्न का उत्तर नहीं दिया।
हेलिश हेट

4
यह ध्यान रखना दिलचस्प है कि अपेक्षित के लिए डिफ़ॉल्ट मान कोई नहीं है, इसलिए केवल @Test के साथ विधि की व्याख्या करना होगा।
oziomajnr


41

अनुपस्थिति / उपस्थिति की जाँच के लिए JUnit 5 (बृहस्पति) तीन कार्य प्रदान करता है:

assertAll​()

दावा है कि सभी आपूर्ति executables
  अपवाद नहीं फेंकती हैं।

assertDoesNotThrow​()

दावा करता है कि
  आपूर्ति का निष्पादन executable/ किसी भी प्रकार के अपवाद supplier
को नहीं फेंकता है

  यह फ़ंक्शन JUnit 5.2.0 (29 अप्रैल 2018) के
  बाद से उपलब्ध है ।

assertThrows​()

इस बात पर ज़ोर आपूर्ति की है कि निष्पादन executable
फेंकता का एक अपवाद expectedType
  है और रिटर्न अपवाद

उदाहरण

package test.mycompany.myapp.mymodule;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;

class MyClassTest {

    @Test
    void when_string_has_been_constructed_then_myFunction_does_not_throw() {
        String myString = "this string has been constructed";
        assertAll(() -> MyClass.myFunction(myString));
    }

    @Test
    void when_string_has_been_constructed_then_myFunction_does_not_throw__junit_v520() {
        String myString = "this string has been constructed";
        assertDoesNotThrow(() -> MyClass.myFunction(myString));
    }

    @Test
    void when_string_is_null_then_myFunction_throws_IllegalArgumentException() {
        String myString = null;
        assertThrows(
            IllegalArgumentException.class,
            () -> MyClass.myFunction(myString));
    }

}

1
यह अब सबसे अच्छा जवाब है। अन्य उत्तरों में JUnit के पुराने संस्करणों पर चर्चा की जा रही है
तेजेश राउत

29

Java 8 इसे बहुत आसान बनाता है, और Kotlin / Scala दोगुना।

हम थोड़ा उपयोगिता वर्ग लिख सकते हैं

class MyAssertions{
  public static void assertDoesNotThrow(FailingRunnable action){
    try{
      action.run()
    }
    catch(Exception ex){
      throw new Error("expected action not to throw, but it did!", ex)
    }
  }
}

@FunctionalInterface interface FailingRunnable { void run() throws Exception }

और फिर आपका कोड बस बन जाता है:

@Test
public void foo(){
  MyAssertions.assertDoesNotThrow(() -> {
    //execute code that you expect not to throw Exceptions.
  }
}

यदि आपके पास जावा -8 तक पहुंच नहीं है, तो मैं एक पुरानी पुरानी जावा सुविधा का उपयोग करूंगा: एक कोड के विपरीत ब्लॉक और एक सरल टिप्पणी

//setup
Component component = new Component();

//act
configure(component);

//assert 
/*assert does not throw*/{
  component.doSomething();
}

और अंत में, कोटलिन के साथ, एक भाषा जिसे मैंने हाल ही में प्यार किया है:

fun (() -> Any?).shouldNotThrow() 
    = try { invoke() } catch (ex : Exception){ throw Error("expected not to throw!", ex) }

@Test fun `when foo happens should not throw`(){

  //...

  { /*code that shouldn't throw*/ }.shouldNotThrow()
}

हालाँकि, आपको यह व्यक्त करने के तरीके के साथ बहुत कुछ करने की गुंजाइश है, मैं हमेशा धाराप्रवाह मुखरता का प्रशंसक था ।


के बारे में

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

यह सिद्धांत में सही है लेकिन निष्कर्ष में गलत है।

जावा नियंत्रण के प्रवाह के लिए अपवादों की अनुमति देता है। यह JRE रनटाइम द्वारा खुद के Double.parseDoubleमाध्यम से NumberFormatExceptionऔर एक के माध्यम से एपीआई में किया जाता Paths.getहै InvalidPathException

यह देखते हुए कि आपने एक घटक लिखा है, जिसके लिए नंबर स्ट्रिंग्स को मान्य किया गया है Double.ParseDouble, हो सकता है कि रेगेक्स का उपयोग करते हुए, शायद हाथ से लिखा हुआ पार्सर, या शायद कुछ ऐसा जो कुछ अन्य डोमेन नियमों को एम्बेड करता है जो किसी विशिष्ट के लिए दोहरे की सीमा को सीमित करता है, यह परीक्षण करने के लिए कितना अच्छा है घटक? मुझे लगता है कि एक स्पष्ट परीक्षण यह दावा करने के लिए होगा कि, जब परिणामी स्ट्रिंग को पार्स किया जाता है, तो कोई अपवाद नहीं फेंका जाता है। मैं उस परीक्षण को ऊपर assertDoesNotThrowया /*comment*/{code}ब्लॉक का उपयोग करके लिखूंगा । कुछ इस तरह

@Test public void given_validator_accepts_string_result_should_be_interpretable_by_doubleParseDouble(){
  //setup
  String input = "12.34E+26" //a string double with domain significance

  //act
  boolean isValid = component.validate(input)

  //assert -- using the library 'assertJ', my personal favourite 
  assertThat(isValid).describedAs(input + " was considered valid by component").isTrue();
  assertDoesNotThrow(() -> Double.parseDouble(input));
}

मैं आपको इस परीक्षण inputका उपयोग करने के लिए पैरामीटर को प्रोत्साहित करने के लिए भी प्रोत्साहित करूंगा ताकि आप अन्य इनपुट के लिए इस परीक्षण का अधिक आसानी से उपयोग Theoriesकर Parameterizedसकें। वैकल्पिक रूप से, यदि आप विदेशी जाना चाहते हैं, तो आप एक परीक्षण-निर्माण उपकरण (और यह ) के लिए जा सकते हैं । TestNG के पास मानकीकृत परीक्षणों के लिए बेहतर समर्थन है।

मुझे जो विशेष रूप से असहनीय लग रहा है वह उपयोग करने की सिफारिश है @Test(expectedException=IllegalArgumentException.class), यह अपवाद खतरनाक रूप से व्यापक है । यदि आपका कोड इस तरह बदलता है कि परीक्षण के निर्माता के तहत घटक है if(constructorArgument <= 0) throw IllegalArgumentException(), और आपका परीक्षण उस तर्क के लिए 0 आपूर्ति कर रहा था क्योंकि यह सुविधाजनक था - और यह बहुत आम है, क्योंकि अच्छा उत्पादन परीक्षण डेटा आश्चर्यजनक रूप से कठिन समस्या है - तो आपका परीक्षण ग्रीन-बार होगा भले ही यह कुछ भी परीक्षण न करे। इस तरह की परीक्षा बेकार से भी बदतर है।


2
(अपेक्षित अपवाद के उपयोग के संबंध में) JUnit 4.13 के बाद से, आप यह Assert.assertThrowsजांचने के लिए उपयोग कर सकते हैं कि कुछ कोड एक अपवाद फेंकता है।
मैजविंड

22

यदि आप अपने कोड में सभी त्रुटियों को पकड़ने के लिए पर्याप्त नहीं हैं। आप मूर्खता कर सकते हैं

class DumpTest {
    Exception ex;
    @Test
    public void testWhatEver() {
        try {
            thisShouldThrowError();
        } catch (Exception e) {
            ex = e;
        }
        assertEquals(null,ex);
    }
}

1
बस एक छोटा सा सुझाव, आपको परीक्षण करने से पहले Exception exहोना चाहिए = null;
डेनेस

4
यह एक महान समाधान नहीं है। यदि वह विधि जो किसी अपवाद को नहीं फेंकनी चाहिए, फेंकती नहीं है, तो आपको एक उपयोगी त्रुटि संदेश नहीं मिलेगा। बस उस विधि को कॉल करें जिसे अपवाद नहीं फेंकना चाहिए, और परीक्षण करें कि यह रिटर्न मान है (या साइड इफेक्ट्स, जैसे अपवाद लॉगिंग)। यदि यह बाद में अप्रत्याशित रूप से एक अपवाद फेंकता है, तो परीक्षण विफल हो जाएगा।
नाम्शुब्रिटर

3
या बस Assert.fail () को पकड़ने में आसान और सुंदर IMO डालें।
isaac.hazan 12

हाँ, मैं आपसे सहमत हूँ। एक और तरीका विधि @Test की चोटी पर कोई टिप्पणी जोड़ने है (उम्मीद = InvalidRequestException.class)
बेन टेनीसन

आपकी गलत वर्तनी भ्रमित कर रही है: thisShouldThroughError -> thisShouldThrowError
ऑस्कर ब्रावो


7

हालाँकि यह पद अभी 6 साल पुराना है, लेकिन, जुनित दुनिया में बहुत कुछ बदल गया है। Junit5 के साथ, अब आप उपयोग कर सकते हैं

org.junit.jupiter.api.Assertions.assertDoesNotThrow()

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

public void thisMethodDoesNotThrowException(){
   System.out.println("Hello There");
}

@Test
public void test_thisMethodDoesNotThrowException(){
  org.junit.jupiter.api.Assertions.assertDoesNotThrow(
      ()-> thisMethodDoesNotThrowException()
    );
}

आशा है कि यह उन लोगों की मदद करेगा जो Junit5 के नए संस्करण का उपयोग कर रहे हैं


काश, यहां एक ठोस अपवाद वर्ग निर्दिष्ट करने का एक तरीका होता। मैं इस के अंदर क्या करना है Awaitility'एस untilAsserted(ThrowingRunnable assertion)। परीक्षण के तहत प्रणाली वर्तमान में थ्रोइंगरुनबल पर एक विशिष्ट अपवाद फेंक रही है जो मैं प्रदान करता हूं, लेकिन मैं इसे कुछ समय देना चाहता हूं जब तक कि ऐसा करना बंद न हो जाए। हालांकि अगर यह एक अलग अपवाद को फेंक देगा तो मैं चाहूंगा कि परीक्षण तुरंत विफल हो जाए।
उबोगेश

1

यदि आप परीक्षण करना चाहते हैं कि क्या आपका परीक्षण लक्ष्य अपवाद का उपभोग करता है। बस परीक्षण छोड़ दें (jMock2 का उपयोग करके मॉक सहयोगी):

@Test
public void consumesAndLogsExceptions() throws Exception {

    context.checking(new Expectations() {
        {
            oneOf(collaborator).doSth();
            will(throwException(new NullPointerException()));
        }
    });

    target.doSth();
 }

यदि आपका लक्ष्य अपवाद का उपभोग करता है, तो परीक्षण पास होगा, अन्यथा परीक्षण विफल हो जाएगा।

यदि आप अपने अपवाद खपत तर्क का परीक्षण करना चाहते हैं, तो चीजें अधिक जटिल हो जाती हैं। मैं सुझाव देता हूं कि खपत को एक सहयोगी को सौंपना चाहिए जिसका मजाक उड़ाया जा सके। इसलिए परीक्षण हो सकता है:

@Test
public void consumesAndLogsExceptions() throws Exception {
    Exception e = new NullPointerException();
    context.checking(new Expectations() {
        {
            allowing(collaborator).doSth();
            will(throwException(e));

            oneOf(consumer).consume(e);
        }
    });

    target.doSth();
 }

लेकिन कभी-कभी यह अति-डिज़ाइन किया जाता है यदि आप इसे लॉग इन करना चाहते हैं। इस मामले में, यह लेख ( http://java.dzone.com/articles/monitoring-declarative-transac , http://blog.novoj.net/2008/09/20/testing-aspect-pointcuts-is-there -an-easy-way / ) यदि आप इस मामले में tdd जोर देते हैं तो मदद कर सकते हैं।


1

AssertNull (...) का उपयोग करें

@Test
public void foo() {
    try {
        //execute code that you expect not to throw Exceptions.
    } catch (Exception e){
        assertNull(e);
    }
}

6
मैं कहूंगा कि यह भ्रामक है। पकड़ ब्लॉक कभी नहीं पहुंचता है, इसलिए assertNullकभी भी निष्पादित नहीं किया जाता है। हालाँकि, त्वरित पाठक को यह धारणा मिलती है कि एक जोर दिया गया है जो वास्तव में गैर-फेंकने के मामले की पुष्टि करता है। दूसरे शब्दों में: यदि पकड़ ब्लॉक तक पहुँच जाती है, तो अपवाद हमेशा गैर-अशक्त होता है - इसे इस प्रकार एक साधारण से बदला जा सकता है fail
एंड्रियास

वास्तव में भ्रामक, ..... लेकिन रुको, ... ओह मैं देख रहा हूं ... assertNull(e)परीक्षण की रिपोर्ट के रूप में विफल हो जाएगा, जैसा कि कहा गया है कि ब्लॉक में eनहीं हो सकता ... माइक यह सिर्फ अजीब प्रोग्रामिंग है: - / /। .. हाँ कम से कम उपयोग की तरह एंड्रियास कहते हैंnullcatchfail()
जूलियन

1

आप यह उम्मीद कर सकते हैं कि नियम बनाकर अपवाद को फेंका नहीं गया है।

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

ExpectedException का उपयोग अपवादों को फेंकने के लिए किया जाता है। आपके द्वारा प्रदान किया गया कोड केवल नियम को प्रारंभ करने के लिए है ताकि आप अपनी आवश्यकताओं को अभिकथन के लिए जोड़ सकें। यह कोड अपने आप में कोई मूल्य नहीं जोड़ता है। Javadoc में यह भी लिखा है: "/ ** * एक {@linkplain TestRule नियम} लौटाता है, जो यह अपेक्षा करता है कि कोई अपवाद नहीं फेंका जाए (इस नियम के बिना व्यवहार के समान)। * /" तो इसके बिना इसके समान सटीक परिणाम होंगे। ।
पिम हजेब्रोक

मैं आपसे सहमत हूं, और इसका उपयोग उस तरह से नहीं करेगा, लेकिन यह सुनिश्चित करना संभव है कि कोई अपवाद नहीं फेंका गया हो। यदि परीक्षा पास होती है, तो यह कहने के लिए पर्याप्त होना चाहिए कि अपवाद नहीं फेंका गया है, लेकिन दूसरे हाथ में अगर कोई सवाल है, तो इसके लिए एक आवश्यकता होनी चाहिए। और शायद ही कभी लेकिन अभी भी कभी-कभी यह दिखाई देने के लिए अच्छा है। क्या होगा यदि कोड और परिस्थितियां बदल गईं और हमारे पास किसी विशेष किनारे के मामले के लिए कोई परीक्षण नहीं है?
लेज़रबाना

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

आपका मतलब क्या है? आप इस पर जोर नहीं देते हैं, आप इसकी उम्मीद करते हैं। इस मामले में, आप कोई अपवाद नहीं होने की उम्मीद करते हैं। यकीन नहीं होता कि आप किस बारे में हैं।
लेज़रबाना

0

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

import org.assertj.core.api.Assertions;
import org.junit.Test;

public class AssertionExample {

    @Test
    public void testNoException(){
        assertNoException();
    }    

    private void assertException(){
        Assertions.assertThatThrownBy(this::doNotThrowException).isInstanceOf(Exception.class);
    }

    private void assertNoException(){
        Assertions.assertThatThrownBy(() -> assertException()).isInstanceOf(AssertionError.class);
    }

    private void doNotThrowException(){
        //This method will never throw exception
    }
}

0

आप इसे @Rule का उपयोग करके कर सकते हैं और फिर कॉल विधि रिपोर्ट कर सकते हैं। अपवाद के रूप में नीचे दिखाया गया है: यह Scala कोड है।

यहां छवि विवरण दर्ज करें


1
private val? यह भाषा कौन सी है? स्पष्ट रूप से जावा नहीं; पी और कृपया, स्क्रीनशॉट के रूप में कोड प्रदान न करें, यह स्वागत योग्य नहीं है।
एंड्रीमोनी जूल

मैं देख रहा हूं कि आपने इसका उल्लेख किया है, यह स्काला है, लेकिन यह कहना कि यह आसानी से जावा में किया जा सकता है , एक मजबूत तर्क नहीं है, मुझे खेद है
एंड्रेमोनि

मैंने उस हिस्से को हटा दिया जो आपको परेशान करता था। मैं छवि को भी बदलने की कोशिश करूंगा। पता नहीं कैसे कोड जोड़ने के लिए अभी तक ..
Crenguta S

-1

निम्नलिखित सभी अपवादों के लिए परीक्षण में विफल रहता है, जाँच या अनियंत्रित:

@Test
public void testMyCode() {

    try {
        runMyTestCode();
    } catch (Throwable t) {
        throw new Error("fail!");
    }
}

-1

आप कनिष्ठ से कथनों के आधार पर किसी भी प्रकार के अपने स्वयं के सिद्धांत बना सकते हैं:

static void assertDoesNotThrow(Executable executable) {
    assertDoesNotThrow(executable, "must not throw");
}
static void assertDoesNotThrow(Executable executable, String message) {
    try {
        executable.execute();
    } catch (Throwable err) {
        fail(message);
    }
}

और परीक्षण:

//the following will succeed
assertDoesNotThrow(()->methodMustNotThrow(1));
assertDoesNotThrow(()->methodMustNotThrow(1), "fail with specific message: facepalm");
//the following will fail
assertDoesNotThrow(()->methodMustNotThrow(2));
assertDoesNotThrow(()-> {throw new Exception("Hello world");}, "Fail: must not trow");

आम तौर पर बोलते हुए किसी भी परिदृश्य में, जहां यह समझ में आता है, वहां तुरंत ("ब्ला ब्ला ब्ला") परीक्षण विफल होने की संभावना है। उदाहरण के लिए, यदि परीक्षण के मामले में कुछ भी फेंका जाता है, तो असफल होने के लिए एक कोशिश / पकड़ ब्लॉक में इसका उपयोग करें:

try{methodMustNotThrow(1);}catch(Throwable e){fail("must not throw");}
//or
try{methodMustNotThrow(1);}catch(Throwable e){Assertions.fail("must not throw");}

यह उस विधि का नमूना है जिसका हम परीक्षण करते हैं, मान लेते हैं कि हमारे पास ऐसी विधि है जो विशिष्ट परिस्थितियों में विफल नहीं होनी चाहिए, लेकिन यह विफल हो सकती है:

void methodMustNotThrow(int x) throws Exception{
    if (x == 1) return;
    throw new Exception();
}

उपरोक्त विधि एक साधारण नमूना है। लेकिन यह जटिल परिस्थितियों के लिए काम करता है, जहां विफलता इतनी स्पष्ट नहीं है। आयात हैं:

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.function.Executable;
import static org.junit.jupiter.api.Assertions.*;

यह जांचने के लिए काफी बेहतर विकल्प हैं कि जोर नहीं दिया गया है जिसमें कस्टम कोड बनाना शामिल नहीं है। @ रूल उनमें से एक है
वरगन

@Vargan ने जिस तरह से अपने स्वयं के अभिकथन बनाने के उद्देश्य से विशेष रूप से JUnit द्वारा डिज़ाइन किया गया है, में अपने स्वयं के दावे बनाने के लिए विधि को इंगित किया है। JUnit प्रदान करता है कि डिज़ाइन द्वारा, विशेष रूप से उस उद्देश्य के लिए, अपने स्वयं के नियम बनाने के लिए, JUnit के व्यवहार को उन सिद्धांतों के साथ विस्तारित करें जो अभी तक लागू नहीं हुए हैं। क्योंकि इस दुनिया में सब कुछ लागू नहीं होता है ये दावे पहचान के रूप में काम करते हैं क्योंकि Jnnit मुखर गुजरने या विफल होने के साथ-साथ रिपोर्टिंग विफलताओं के संदर्भ में काम करता है।
आर्मडेडेस्क्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.