是否有某种方法可以根据@Test禁用创建Test的新实例?
答案 0 :(得分:6)
每个测试一个实例是JUnit默认工作的方式。但是,您可以编写自己的测试运行器,该测试运行器使用一个实例进行所有测试。您可能希望从扩展BlockJUnit4ClassRunner开始。
答案 1 :(得分:5)
为了得到这个答案:
public class MyTestClass {
private static String onceForAllTests;
@AfterClass
public static void afterClass() {
onceForAllTests = null; // silly, but just to demonstrate
}
@BeforeClass
public static void beforeClass() {
onceForAllTests = "This is set once for all tests";
}
@Test
public void sillyTest {
String someTestValue = "This is set during method";
assertNotEquals( onceForAllTests, someTestValue );
}
}
答案 2 :(得分:2)
我最终独立到达Mathew上面提出的解决方案。我想在这里发布我的简短解决方案。
Kotlin中的代码:
class SingleInstanceRunner<T>(clazz : Class<T>) : BlockJUnit4ClassRunner(clazz) {
val instance : Any by lazy { super.createTest() }
override fun createTest() = instance
}
以下是上述的(未经测试的)Java翻译:
private static class SingleInstanceRunner extends BlockJUnit4ClassRunner {
private Object instance;
SingleInstanceRunner(Class<?> clazz) throws InitializationError {
super(clazz);
}
@Override
protected synchronized Object createTest() throws Exception {
if (instance == null) {
instance = super.createTest();
}
return instance;
}
}
使用此解决方案,使用此跑步者注释您的测试类。
在Kotlin:
@RunWith(SingleInstanceRunner::class)
class MyTest {
...
}
在Java中:
@RunWith(SingleInstanceRunner.class)
public class MyTest {
...
}
这与@FixMethodOrder
结合使用,可以在某些系统测试类型场景中使用junit。