0

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

3 回答 3

5

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

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

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

于 2018-03-13T08:18:51.317 回答
1
  • 每个@Test带注释的方法都独立于新的重新初始化ai值 ( 1) 运行,因此test2失败。
  • 您最好在一次测试中运行test1并检测正确的工作结果(属于您的实际问题)。看看代码清单Ai-incrementtest2getAndIncrement()

    //*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

于 2018-03-13T08:38:56.047 回答
1

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

private static AtomicInteger ai = new AtomicInteger(1);

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

于 2021-06-17T11:54:33.617 回答