使用实例而不是类运行JUnitCore

时间:2017-11-30 15:53:47

标签: java junit4

我希望以编程方式运行 JUnit 4.12 + ,并粗略地搜索这样做(在许多其他类似帖子中)this answer,其中规定了以下基本解决方案:< / p>

@RunWith(Suite)
@Suite.SuiteClasses ({
    MyTestClass1.class,
    MyTestClass2.class
})
public class MyTestSuite {
}

Result testResults = JUnitCore.runClasses(MyTestSuite.class);

......我能够让这个工作,没有汗水。到目前为止一切都很好!

问题是:我有一些非常复杂的测试类需要在运行时实例化/注入非常特定的属性...不能从无参数构造函数中完成。但是上面的方法(指定只运行任何一组类的旧实例)不允许您实例化测试类,配置它们,然后然后运行它们

有办法做到这一点吗?我找不到任何关于JUnit API的内容。我正在寻找类似的东西:

MyTestClass1 mtc1 = new MyTestClass1(...);
MyTestClass2 mtc2 = new MyTestClass2(...);
Result testResults = JUnitCore.run(mtc1, mtc2);

2 个答案:

答案 0 :(得分:1)

您可能需要自定义运行器才能实现这一目标。 Junit 4/5带有第三方运行程序,可以为构造函数和方法执行依赖注入。很少受欢迎的跑步者是Mockito(MockitoJUnitRunner)和SpringJUnit4ClassRunner,以防你使用Spring。您可以在以下位置查看自定义跑步者和实施细节: https://github.com/junit-team/junit4/wiki/Custom-runners

答案 1 :(得分:0)

我使用带有示例的自定义Runner(Groovy伪代码),如下所示:

class MyRunner extends Runner {
    @Override
    Description getDescription() {
        return null
    }

    @Override
    void run(RunNotifier notifier) {
        // LoginTests.class is a test class I want to run
        LoginTests loginTests = new LoginTests(<my args here>)

        Description description = Description.createSuiteDescription(LoginTests)
        notifier.fireTestStarted(description)
        try {
            log.info("About to doSomething()...")
            loginTests.doSomething()
            log.info("Did it...")
            notifier.fireTestFinished(description)
        } catch(Throwable throwable) {
            log.info("doSomething() failed...")
            notifier.fireTestAssumptionFailed(new Failure(description, throwable))
        }
    }
}

Result testResults = new JUnitCore().run(Request.runner(new MyRunner()))