首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确关闭JUnit-Runner?

如何正确关闭JUnit-Runner?
EN

Stack Overflow用户
提问于 2016-11-18 15:37:14
回答 2查看 351关注 0票数 1

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

它看起来有点像这样:

代码语言:javascript
复制
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()。我应该在哪里调用它,以便在测试运行后清理我的资源?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-18 16:03:26

我应该在哪里调用它,以便在测试运行后清理我的资源?

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

(1)创建自己的RunListener类:

代码语言:javascript
复制
public class MyRunnerListener extends RunListener {
    private Context context;

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

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

(2)使用MyRunnerListener Use :

代码语言:javascript
复制
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);
    }
}

如果您不想使用Runner**,,那么您可以按照马库斯的回答(使用** TestRule**,to ** TestRunner**).** )。

票数 -1
EN

Stack Overflow用户

发布于 2016-11-18 16:34:16

我不知道你想取得什么成就,但你已经看过s**了吗?

代码语言:javascript
复制
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();
    }

}

用法:

代码语言:javascript
复制
public class MyTest {
    @ClassRule
    public static MyContextRule contextRule = new MyContextRule(); 

    //...
}

JUnit Rule相对于Runners的优势是,您可以拥有其中的多个,而您只能有一个跑步者。

因此,您的自定义Rule可以与任何运行程序一起使用,这些运行程序可能是由随机测试框架引入的,您将来可能会遇到.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40680888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档