在JUnit测试中,AtomicInteger不会增加

时间:2018-03-13 08:16:21

标签: java junit increment atomicinteger

我有以下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

3 个答案:

答案 0 :(得分:5)

测试在新实例上运行。 test1()的行为不会以任何方式影响test2(),否则可能会导致单个失败的测试失败,导致其后的所有其他测试失败。这将使得更难找出问题的根源,而你却不想这样做。

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

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

答案 1 :(得分:1)

  • 每个@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

答案 2 :(得分:1)

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

private static AtomicInteger ai = new AtomicInteger(1);

但是您还有另一个问题——您不能保证首先运行 test1,然后运行 ​​test2。因此,您还需要考虑到这一点重新编写测试或使用类似 @TestMethodOrder(Alphanumeric.class)