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

时间:2013-03-22 15:24:00

标签: java testing junit4

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

3 个答案:

答案 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。