2013-03-22 42 views

回答

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

一个实例是JUnit的工作方式是默认的方式。然而,你可以编写你自己的测试运行器,它为所有测试使用一个单独的实例。您可能需要首先扩展BlockJUnit4ClassRunner

0

我最终独立到达Mathew上面提出的解决方案。我认为会在这里发布我的简短解决方案。

在科特林代码:

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

通过这一解决方案,这个亚军注释您的测试类。

在科特林:

@RunWith(SingleInstanceRunner::class) 
class MyTest { 
    ... 
} 

在Java:

@RunWith(SingleInstanceRunner.class) 
public class MyTest { 
    ... 
} 

这在结合使用@FixMethodOrder采用的junit在某些系统测试类型场景。

相关问题