是否有某种方法可以禁用每个 @Test 创建新的 Test 实例?
问问题
2577 次
3 回答
6
每个测试一个实例是 JUnit 默认的工作方式。但是,您可以编写自己的测试运行程序,该运行程序对所有测试使用一个实例。您可能希望从扩展BlockJUnit4ClassRunner开始。
于 2013-03-22T15:32:12.740 回答
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 );
}
}
于 2013-03-22T15:31:00.043 回答
2
我最终独立地得出了 Mathew 上面建议的解决方案。我想在这里发布我的简短解决方案。
Kotlin 中的代码:
class SingleInstanceRunner<T>(clazz : Class<T>) : BlockJUnit4ClassRunner(clazz) {
val instance : Any by lazy { super.createTest() }
override fun createTest() = instance
}
这是上面的(未经测试的)Java翻译:
public class SingleInstanceRunner extends BlockJUnit4ClassRunner {
private Object instance;
public SingleInstanceRunner(Class<?> clazz) throws InitializationError {
super(clazz);
}
@Override
protected synchronized Object createTest() throws Exception {
if (instance == null) {
instance = super.createTest();
}
return instance;
}
}
使用此解决方案,使用此运行器注释您的测试类。
在科特林:
@RunWith(SingleInstanceRunner::class)
class MyTest {
...
}
在 Java 中:
@RunWith(SingleInstanceRunner.class)
public class MyTest {
...
}
@FixMethodOrder
这与在某些系统测试类型场景中使用 junit结合使用。
于 2017-07-24T01:03:11.573 回答