2012-10-18 12 views
14

org.junit.rules.MethodRule और org.junit.rules.TestWatchman को बहिष्कृत कर दिया गया है।क्यों जुनीट मेथडरूल और टेस्टवैचमैन को बहिष्कृत किया गया है?

एक दिलचस्प टिप्पणी पर था: https://github.com/junit-team/junit/pull/519, भाग में: "कई डेवलपर्स वैध कारण MethodRule साथ रहना और JUnit टीम MethodRule के लिए समर्थन को दूर करने की कोई योजना नहीं हैं ..."

http://junit-team.github.io/junit/javadoc/4.10/org/junit/rules/TestWatchman.html दस्तावेज: "बहिष्कृत। MethodRule को बहिष्कृत किया गया है। TestWatcher का उपयोग करें इसके बजाय TestRule लागू करता है।" और कुछ उदाहरण कोड प्रदान करता है।

इन बहिष्कृतों को चिह्नित करने के पीछे तर्क क्या है? टेस्टवॉचर और बहिष्कृत टेस्टवाचमैन के बीच व्यापार क्या है? क्या आपके पास इस विशिष्ट विषय पर सारांश या सिंहावलोकन के लिए एक अच्छा लिंक है?

+1

देखें: "। MethodRule नहीं रह गया है अब मान्य नहीं है" Https://github.com/KentBeck/junit/blob/master/doc/ReleaseNotes4.11.md – sversch

उत्तर

19

कारण सरल है, TestRuleMethodRule को प्रतिस्थापित करने की योजना बनाई गई थी। MethodRule 4.7 में लागू पेश किया गया था, और यह एक विधि के साथ एक अंतरफलक है:

Statement apply(Statement base, FrameworkMethod method, Object target) 

FrameworkMethod (लगभग) एक आंतरिक JUnit वर्ग है, जो पहली जगह में उजागर नहीं किया जाना चाहिए है। object वह ऑब्जेक्ट है जिस पर विधि चलयी जाएगी, उदाहरण के लिए, आप प्रतिबिंब का उपयोग करके परीक्षण की स्थिति को संशोधित कर सकते हैं।

TestRule 4.9 में पेश किया गया था, हालांकि, यह है:

Statement apply(Statement base, Description description) 

Description एक अपरिवर्तनीय परीक्षण का विवरण युक्त POJO है। एक परीक्षण के भीतर राज्य को संशोधित करने का तरीका TestRule का उपयोग कर परीक्षण में सही ढंग से encapsulate है। यह एक पूरी तरह से क्लीनर डिजाइन है।

TestWatchman(MethodRule) और TestWatcher(TestRule) के बीच विशिष्ट अंतर न्यूनतम है, सिवाय इसके कि TestWatcher में बेहतर त्रुटि हैंडलिंग है, इसलिए इसे वरीयता में उपयोग किया जाना चाहिए। दोनों में succeeded(), failed(), starting(), finished() जैसे अतिव्यापी तरीके हैं।

public static class WatchmanTest { 
    private static String watchedLog; 

    @Rule 
    public TestWatcher watchman= new TestWatcher() { 
    @Override 
    protected void failed(Throwable e, Description description) { 
     watchedLog+= description + "\n"; 
    } 

    @Override 
    protected void succeeded(Description description) { 
     watchedLog+= description + " " + "success!\n"; 
    } 
    }; 

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

    @Test 
    public void succeeds() { 
    } 
} 

TestWatcher(TestRule) अतिरंजित तरीकों में अपवादों को संभालता है। यदि अपवाद फेंक दिए जाते हैं, तो परीक्षण विधि निष्पादन के बाद, विफल होने के बाद विफल हो जाती है।

अधिक जानकारी के लिए JUnit के संस्करण 4.11 के लिए रिलीज नोट्स के अनुसार TestWatcher और TestWatchman

+1

देखें तो क्यों JUnit 4.11 में MethodRule को बहिष्कृत नहीं किया गया है? – BrunoJCM

+1

इसे हटा दिया गया था क्योंकि इसमें अभी भी कुछ उपयोग के मामले हैं: https://github.com/junit-team/junit/pull/519 देखें –