AtomicInteger 在 JUnit 测试中不会增加
AtomicInteger does not get incremented in JUnit tests
我有以下 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
测试 运行 新实例。 test1()
的行为不能以任何方式影响 test2()
,否则它可能导致单个失败的测试导致所有其他测试失败。这将使查明问题的根源变得更加困难,而您不希望这样。
如果您想测试多个调用之间的行为,您需要创建一个将这两个方法作为一个单元一起调用的测试,或者继续进行集成测试,您可以在其中测试大量代码正确工作。
您的测试在逻辑上也是错误的,因为您正在递减该值。您的(错误的)期望值将是 0
而不是 2
.
- 每个
@Test
注释方法 运行 与新的重新初始化的 ai
值 (1
) 无关,因此 test2
失败。
你最好在一次测试中 运行 test1
和 test2
检测正确的工作 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
。
您可以将 'static' 添加到 AtomicInteger 初始化中,每个测试实例将使用相同的变量。像这样:
private static AtomicInteger ai = new AtomicInteger(1);
但是您还有另一个问题 - 您不能保证 test1 将首先 运行 而 test2 第二。因此,您还需要考虑到这一点重新编写测试或使用类似 @TestMethodOrder(Alphanumeric.class)
我有以下 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
测试 运行 新实例。 test1()
的行为不能以任何方式影响 test2()
,否则它可能导致单个失败的测试导致所有其他测试失败。这将使查明问题的根源变得更加困难,而您不希望这样。
如果您想测试多个调用之间的行为,您需要创建一个将这两个方法作为一个单元一起调用的测试,或者继续进行集成测试,您可以在其中测试大量代码正确工作。
您的测试在逻辑上也是错误的,因为您正在递减该值。您的(错误的)期望值将是 0
而不是 2
.
- 每个
@Test
注释方法 运行 与新的重新初始化的ai
值 (1
) 无关,因此test2
失败。 你最好在一次测试中 运行
test1
和test2
检测正确的工作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
。
您可以将 'static' 添加到 AtomicInteger 初始化中,每个测试实例将使用相同的变量。像这样:
private static AtomicInteger ai = new AtomicInteger(1);
但是您还有另一个问题 - 您不能保证 test1 将首先 运行 而 test2 第二。因此,您还需要考虑到这一点重新编写测试或使用类似 @TestMethodOrder(Alphanumeric.class)