【问题标题】:Junit: How to make every @Test methods isolated completely?Junit:如何使每个@Test 方法完全隔离?
【发布时间】:2016-07-30 13:40:59
【问题描述】:

示例代码:

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 之前运行。

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

【问题讨论】:

  • 但是这样做的目标是什么?基本上你正在测试静态方法,所以堆上没有特定对象的实例。我的建议是重构您的代码以不使用 static 方法。其他解决方案是使用@Before 注释并在那里重置所有需要的值。

标签: java unit-testing intellij-idea junit


【解决方案1】:

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

您的选择是:

  1. 重构您的代码
  2. 使用@Before 注释。如果您有很多变量,这可能是一个问题。虽然编写代码很无聊,但如果您忘记重置其中一个变量,您的一项测试将会失败,因此至少您有机会修复它。
  3. 使用反射动态查找类的所有成员并重置它们。
  4. Reload the class via the class loader
  5. 重构你的类。 (我知道我之前提到过,但它非常重要,我认为值得再次提及)

3 和 4 做了大量工作,收获不大。如果您开始尝试并行运行测试,除了重构之外的任何解决方案都会给您带来问题。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 如果我有很多像Count.count 这样的东西怎么办?有没有更好的方法来提供清理环境?
    • @guo 只需在使用 Before 注释的方法中清理您想要的所有内容。如果这样做,请不要忘记选择 resetCount 以外的其他名称。
    猜你喜欢
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    相关资源
    最近更新 更多