2011-03-24 9 views
5

जब मैं जुनीट में कोई दावा विफल रहता हूं तो मैं कुछ "अपनी सामग्री" करना चाहता हूं। मुझे यह होना चाहिए:JUnit Assert फ़ंक्शंस को इंटरसेप्टिंग

public class MyAssert extends org.junit.Assert { 

    // @Override 
    static public void fail(String message) { 
     System.err.println("I am intercepting here!"); 
     org.junit.Assert.fail(message); 
    } 
} 

बेशक, यह काम नहीं करता है, क्योंकि आप स्थैतिक तरीकों को ओवरराइड नहीं कर सकते हैं। लेकिन अगर ऐसा होता है, तो यह अच्छा होगा, क्योंकि assertTrue() जैसे प्रत्येक जोर कार्य fail() विधि को कॉल करता है। इस प्रकार, मैं आसानी से हर दावे को रोक सकता था।

क्या assert... के सभी अलग-अलग स्वादों को लागू किए बिना मैं यहां क्या करना चाहता हूं, ऐसा करने का कोई तरीका मौजूद है?

उत्तर

1

आप एक कक्षा लिख ​​सकते हैं जो असर में सभी विधियों के बिल्कुल समान हस्ताक्षर लागू करता है और फिर आवेषण विधियों को प्रतिनिधि करता है।

public class MyAssert { 
    static public void assertTrue(String message, boolean condition) { 
     Assert.assertTrue(message, condition); 
    } 

    ... 

    static public void fail(String message) { 
     System.err.println("I am intercepting here!"); 
     Assert.fail(message); 
    } 
} 

बिल्कुल सभी विधियों को फिर से कार्यान्वित नहीं करना, लेकिन फिर भी थकाऊ। आपका आईडीई प्रतिनिधि विधियों को उत्पन्न करने में मदद कर सकता है।

3

आपको जूनिट 4.7 में पेश किए गए नियमों पर एक नज़र डालना चाहिए। विशेष रूप से टेस्टवैचमैन:

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

http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/TestWatchman.html

यह आपको एक MethodRule कि टेस्ट में नाकाम रहने के संभाल कर सकते हैं परिभाषित करने देता है (जावाडोक से कॉपी):

@Rule 
    public MethodRule watchman= new TestWatchman() { 
      @Override 
      public void failed(Throwable e, FrameworkMethod method) { 
        watchedLog+= method.getName() + " " + e.getClass().getSimpleName() 
            + "\n"; 
      } 

      @Override 
      public void succeeded(FrameworkMethod method) { 
        watchedLog+= method.getName() + " " + "success!\n"; 
      } 
    }; 

    @Test 
    public void fails() { 
      fail(); 
    } 

    @Test 
    public void succeeds() { 
    } 

टिप्पणी के अनुसार TestWatchman JUnit के नए संस्करण में depecreated जाता है और TestWatcher के साथ बदल दिया है (लेकिन कार्यक्षमता एक ही है):

http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/TestWatcher.html

+2

टेस्टवैचमैन टेस्टवॉचर के पक्ष में बहिष्कृत किया गया प्रतीत होता है। (उपरोक्त लिंक टूटा हुआ है) –

0

अविश्वसनीय दावों के लिए आप AssertionError को पकड़ सकते हैं - मेरे लिए निम्नलिखित कार्य। यह तब उपयोगी होता है जब आपको कभी-कभी कार्यक्षमता की आवश्यकता होती है।

try { 
    Assert.assertEquals("size", classes.length, containerList.size()); 
} catch (AssertionError e) { 
    System.err.println("ERROR"); 
    for (AbstractContainer container : containerList) { 
     System.err.println(container.getClass()); 
    } 
    throw (new RuntimeException("Failed", e)); 
}