在模块中自定义Junit测试套件的执行

时间:2011-02-07 07:32:52

标签: unit-testing junit

我有一组Junit 4测试类,我想在多个模块中运行,具有不同的BeforeClass,AfterClass,Before和After钩子。通过@Rule注入,我只得到测试方法的包装,但没有BeforeClass和AfterClass行为。

此外,我不想对测试运行器这样做,因为我已经修复了测试运行器以用于大量测试。

对目标模块中的每个测试类进行子类化并在那里应用自定义似乎不是一个好的解决方案。

最好的方法是在目标模块中宣布这样的东西

@RunWith(Suite.class)
@Suite.SuiteClasses({
  investmentTests.class,
  catalogTests.class,
  markerTests.class 
})
public class AllTests {
    // why on earth I need this class, I have no idea! 
}

并有一些环境挂钩来应用前/后代码。

您是否遇到过此问题的解决方案?

1 个答案:

答案 0 :(得分:2)

正如NamshubWriter所评论的那样,在JU​​nit4.9中可以找到 org.junit.ClassRule @ClassRule代替@Rule; TestRule代替MethodRule

参见示例:

public static class CustomCounter extends TestRule {
    public int count = 0;

    @Override
    protected Statement apply(final Statement base, Description description) {
        return new Statement() {                
            @Override
            public void evaluate() throws Throwable {
                count++;
                base.evaluate();
            }
        };
    }       
}

public static class ExampleTestWithCustomClassRule {
    @ClassRule
    public static CustomCounter counter= new CustomCounter();

    @Test
    public void firstTest() {
        assertEquals(1, counter.count);
    }

    @Test
    public void secondTest() {
        assertEquals(1, counter.count);
    }
}