运行 带有实例而不是 类 的 JUnitCore
Running JUnitCore with instances instead of classes
我正在以编程方式寻找 运行 JUnit 4.12+,并且粗略地搜索了一下(在许多其他类似的帖子中)this answer , 它规定了以下基本解决方案:
@RunWith(Suite)
@Suite.SuiteClasses ({
MyTestClass1.class,
MyTestClass2.class
})
public class MyTestSuite {
}
Result testResults = JUnitCore.runClasses(MyTestSuite.class);
...我能够让这个工作,不费吹灰之力。到目前为止一切顺利!
问题是:我有一些非常复杂的测试 类 需要 instantiated/injected 在 运行 时具有非常具体的属性...这不是可以从内部完成的事情无参数构造函数。但是上面的方法(仅指定 运行 any 一组 类 的旧实例)不允许您实例化测试 类 ,配置它们,然后然后 运行它们。
有办法吗?我在 JUnit API 中找不到任何内容。我正在寻找类似的东西:
MyTestClass1 mtc1 = new MyTestClass1(...);
MyTestClass2 mtc2 = new MyTestClass2(...);
Result testResults = JUnitCore.run(mtc1, mtc2);
您可能需要自定义运行器来实现它。 Junit 4/5 带有第三方运行器,可以为构造函数和方法执行依赖注入。 Mockito(MockitoJUnitRunner) 和 SpringJUnit4ClassRunner 是非常流行的,如果您使用的是 Spring。您可以在以下位置查看自定义运行器和实现细节:
https://github.com/junit-team/junit4/wiki/Custom-runners
我使用带有示例(Groovy 伪代码)的自定义 Runner
进行了如下操作:
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()))
我正在以编程方式寻找 运行 JUnit 4.12+,并且粗略地搜索了一下(在许多其他类似的帖子中)this answer , 它规定了以下基本解决方案:
@RunWith(Suite)
@Suite.SuiteClasses ({
MyTestClass1.class,
MyTestClass2.class
})
public class MyTestSuite {
}
Result testResults = JUnitCore.runClasses(MyTestSuite.class);
...我能够让这个工作,不费吹灰之力。到目前为止一切顺利!
问题是:我有一些非常复杂的测试 类 需要 instantiated/injected 在 运行 时具有非常具体的属性...这不是可以从内部完成的事情无参数构造函数。但是上面的方法(仅指定 运行 any 一组 类 的旧实例)不允许您实例化测试 类 ,配置它们,然后然后 运行它们。
有办法吗?我在 JUnit API 中找不到任何内容。我正在寻找类似的东西:
MyTestClass1 mtc1 = new MyTestClass1(...);
MyTestClass2 mtc2 = new MyTestClass2(...);
Result testResults = JUnitCore.run(mtc1, mtc2);
您可能需要自定义运行器来实现它。 Junit 4/5 带有第三方运行器,可以为构造函数和方法执行依赖注入。 Mockito(MockitoJUnitRunner) 和 SpringJUnit4ClassRunner 是非常流行的,如果您使用的是 Spring。您可以在以下位置查看自定义运行器和实现细节: https://github.com/junit-team/junit4/wiki/Custom-runners
我使用带有示例(Groovy 伪代码)的自定义 Runner
进行了如下操作:
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()))