1

我通过实现创建了自己的 JUnit-Runner org.junit.runner.Runner,这样我就可以使用@RunWith-Annotation 与它们一起运行我的 UnitTests。

它看起来有点像这样:

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通过调用MyContext.close(). 我应该在哪里调用它,以便在测试运行后清理我的资源?

4

2 回答 2

1

我不确定您要达到什么目的,但是您已经看过JUnit 的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相对于 sRule的优势Runner在于您可以拥有多个,而您只能拥有一个 runner。

因此,您的自定义Rule可以与您将来可能遇到的随机测试框架引入的任何跑步者一起使用......

于 2016-11-18T16:34:16.773 回答
-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) 在 MyRunner 中使用 MyRunnerListener :

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);
    }
}

PS:如果您不想使用Runner,那么您可以按照 Markus 的答案(使用TestRule, NOT TestRunner)。

于 2016-11-18T16:03:26.693 回答