2012-10-18 77 views
14

org.junit.rules.MethodRule和org.junit.rules.TestWatchman已被棄用。爲什麼JUnit MethodRule和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。」並提供了一些示例代碼。

標記這些棄用的原因是什麼? 什麼是TestWatcher和棄用的TestWachman之間的折衷? 對於這個特定主題的概要或概述,你有很好的鏈接嗎?

+1

根據選擇JUnit的4.11版本的發佈說明:「MethodRule不再是過時了。」請參閱https://github.com/KentBeck/junit/blob/master/doc/ReleaseNotes4.11.md – sversch

回答

19

原因很簡單,TestRule計劃取代MethodRuleMethodRule引入在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在測試中正確封裝。這是一個完全清潔的設計。

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)在處理方法中處理異常。如果引發異常,則測試方法在執行測試之後而不是在執行期間失敗。

欲瞭解更多信息,請參閱TestWatcherTestWatchman

+1

,爲什麼MethodRule在JUnit 4.11中不再被棄用? – BrunoJCM

+1

它已被取消棄用,因爲它仍有一些使用案例:請參閱https://github.com/junit-team/junit/pull/519 –

相關問題