2016-11-18 451 views
1

我通過執行org.junit.runner.Runner來製作我自己的JUnit-Runner,這樣我就可以使用@RunWith -Annotation來運行我的UnitTests。如何正確關閉JUnit-Runner?

它有點lookes這樣的:

public class MyRunner extends Runner { 

    private Context myContext; 
    myContext.init(); 
    private final BlockJUnit4ClassRunner runner; 

    public MyRunner(final Class<?> clazz) throws InitializationError { 
     myContext = new Context(); 

     runner = new BlockJUnit4ClassRunner(clazz); 
    } 

    @Override 
    public void run(final RunNotifier notifier) { 
     runner.run(notifier); 
    } 

    @Override 
    public Description getDescription() { 
     return runner.getDescription(); 
    } 

    public void filter(final Filter filter) throws NoTestsRemainException { 
     runner.filter(filter); 
    } 
} 

清理資源,我必須通過調用MyContext.close()關閉MyContext。我應該在哪裏調用這個,以便在測試運行後我的資源已經清理完畢?

回答

-1

我應該在哪裏調用這個,以便我的資源在 測試運行後清理乾淨?

更新了我的答案,你可以使用org.junit.runner.notification.RunListener如下圖所示:

(1)創建自己的RunListener類:

public class MyRunnerListener extends RunListener { 
    private Context context; 

    public MyRunnerListener(Context context) { 
     this.context = context; 
    } 

    void testRunFinished(Result result) { 
      context.close(); 
    } 
} 

(2)使用MyRunnerListener內MyRunner:

public class MyRunner extends Runner { 

    private Context myContext; 
    MyRunnerListener runnerListener; 
    private final BlockJUnit4ClassRunner runner; 

    public MyRunner(final Class<?> clazz) throws InitializationError { 
     myContext = new Context(); 
     myContext.init(); 
     runnerListener = new MyRunnerListener(myContext); 

     runner = new BlockJUnit4ClassRunner(clazz); 
    } 

    @Override 
    public void run(final RunNotifier notifier) { 
     notifier.addListener(runnerListener); 
     runner.run(notifier); 
    } 

    @Override 
    public Description getDescription() { 
     return runner.getDescription(); 
    } 

    public void filter(final Filter filter) throws NoTestsRemainException { 
     runner.filter(filter); 
    } 
} 

P.S .:如果你不想使用Runner,那麼你可以按照Markus(使用TestRule,而不是TestRunner)的回答。

+0

這不回答這個問題,因爲這適用於類下測試,但不是跑步者。 – Bob

+0

更新了答案,看它 – developer

+0

這將無法正常工作,因爲跑步者可能會被多個測試類使用。 – Bob

1

我不確定你要存檔的內容,但是你已經看過了嗎?JUnit's Rules

public class MyContextRule extends ExternalResource { 

    private final Context myContext; 

    public MyContextRule() { 
     myContext = new Context(); 
    } 

    @Override 
    protected void before() throws Throwable { 
     myContext.init(); 
    } 

    @Override 
    protected void after() { 
     myContext.close(); 
    } 

} 

用法:

public class MyTest { 
    @ClassRule 
    public static MyContextRule contextRule = new MyContextRule(); 

    //... 
} 

的JUnit Rule的優勢超過Runner s是,你可以讓他們多,而你只能有一個亞軍。

所以,您的自定義Rule可以與可由隨機testframework,你可能會在未來整個引入的任何運動員使用...