Junit:如何让每个@Test方法完全隔离?

时间:2016-07-30 13:41:00

标签: java unit-testing intellij-idea junit

示例代码:

public class Count {
    static int count;

    public static int add() {
       return ++count;
    } 
}

我希望test1和test2完全分开运行,以便它们都通过。我怎么能完成那个?我的IDE是Intellij IDEA。

public class CountTest {
    @Test
    public void test1() throws Exception {
        Count.add();
        assertEquals(1, Count.count);//pass.Now count=1
    }

    @Test
    public void test2() throws Exception {
        Count.add();
        assertEquals(1, Count.count);//error, now the count=2
    }
}

假设test1在test2之前运行。

这只是一个简化的代码。实际上代码更复杂,所以我不能只在count=0方法中生成@after

2 个答案:

答案 0 :(得分:2)

没有自动重置类中所有静态变量的方法。这就是为什么你应该重构你的代码以停止使用静态的一个原因。

您的选择是:

  1. 重构您的代码
  2. 使用@Before注释。如果您有很多变量,这可能是个问题。虽然写出无聊的代码,如果你忘记重置其中一个变量,你的一个测试将会失败,所以至少你有机会修复它。
  3. 使用反射动态查找班级的所有成员并重置它们。
  4. Reload the class via the class loader
  5. 重写你的课程。 (我知道我之前已经提到它,但它非常重要,我认为值得一提)
  6. 3和4是很多工作,没有太大的收获。如果您开始尝试并行运行测试,除了重构之外的任何解决方案仍然会给您带来问题。

答案 1 :(得分:1)

在每次测试前使用@Before注释重新初始化变量:

@Before
public void resetCount(){
    Count.count = 0;
}