3

是否有某种方法可以禁用每个 @Test 创建新的 Test 实例?

4

3 回答 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 回答