【问题标题】:AtomicInteger does not get incremented in JUnit testsAtomicInteger 在 JUnit 测试中不会增加
【发布时间】:2018-03-13 08:16:20
【问题描述】:

我有以下 JUnit 测试,但不知道为什么第二个测试没有通过,i 的值在两个测试中都是 1。

public class TestTest {

  private AtomicInteger ai = new AtomicInteger(1);

  @Test
  public void test1() {
    int i = ai.getAndIncrement();
    Assert.assertEquals(1, i);
  }

  @Test
  public void test2() {
    int i = ai.getAndIncrement();
    Assert.assertEquals(2, i);
  }
}

test1 通过,test2 失败并显示以下消息:

java.lang.AssertionError: 
Expected :2
Actual   :1

【问题讨论】:

  • 如果要递增,为什么要调用递减方法?
  • 呃,不知道你错过了什么。针对相同的表达式 (ai.getAndDecrement()),您同时断言 1 和 2。其中只有一个是正确的。
  • 是的,抱歉打错了,getAndIncrement

标签: java junit increment atomicinteger


【解决方案1】:

测试在新实例上运行。 test1() 的行为不能以任何方式影响test2(),否则它可能导致单个失败的测试使其后面的所有其他测试失败。这会使查明问题的根源变得更加困难,而且您不希望这样。

如果您想测试多个调用之间的行为,您需要创建一个将这两种方法作为一个单元一起调用的测试,或者继续进行集成测试,您可以在其中测试大量代码以确保其正常工作.

您的测试在逻辑上也是错误的,因为您正在减少值。您的(错误的)期望值将是 0 而不是 2

【讨论】:

  • 对 getAndIncrement 感到抱歉,我的意思是 getAndIncrement。您是指整个 TestTest 类的新实例吗?
  • 相对于...什么...AtomicInteger的新实例?是的,当然是测试类的新实例。
  • 是的。好的,我明白了,所以行为是每个测试的运行就像它是类中唯一的测试一样。
  • 没错。这样,它只测试它应该做的事情,并且不受其他测试可能引起的任何副作用。
【解决方案2】:
  • 每个带有 @Test 注释的方法都独立于新的重新初始化的 ai 值 (1) 运行,因此 test2 失败。
  • 您最好在一次测试中运行 test1test2 以检测正确的工作 getAndIncrement() 结果(属于您的实际问题)。看看代码清单 Ai-increment

    //*Code listing: Ai-increment*    
    private AtomicInteger ai;
    
    @Before
    public void before() {
        ai = new AtomicInteger(1);
    }
    
    @Test
    public void test() {
        assertEquals(1, ai.getAndIncrement());
        assertEquals(2, ai.getAndIncrement());
    }
    
  • 此外,您可以使用@Before 代替private AtomicInteger ai = new AtomicInteger(1);。因此,您以原子方式为每个测试确保分配的值1

【讨论】:

    【解决方案3】:

    您可以在 AtomicInteger 初始化中添加“静态”,每个测试实例都将使用相同的变量。像这样:

    private static AtomicInteger ai = new AtomicInteger(1);
    

    但是您还有另一个问题 - 您不能保证 test1 将首先运行,而 test2 将在第二个运行。因此,您还需要考虑到这一点重新编写测试或使用@TestMethodOrder(Alphanumeric.class) 之类的东西

    【讨论】:

    • 确实有效。并且还同意让您的测试相互依赖是不好的做法。
    猜你喜欢
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 2014-09-24
    • 2019-07-31
    相关资源
    最近更新 更多