Junit,如何禁用每个测试方法创建Test的新实例

有没有一些方法来禁用Test per @Test的创建新实例?

为了使这个答案:

 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 ); } } 

每个测试一个实例是JUnit默认工作的方式。 但是,您可以编写自己的测试运行器,其中所有测试都使用一个实例。 你可能想要从扩展BlockJUnit4ClassRunner开始。

我最终独立到达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。