Java 在JUnit测试中,AtomicInteger不会递增
我有下面的JUnit测试,无法解释为什么第二个测试没有通过,两个测试中Java 在JUnit测试中,AtomicInteger不会递增,java,junit,increment,atomicinteger,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()
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
测试将在新实例上运行。test1()
的行为不会以任何方式影响test2()
,否则它可能会导致一个失败的测试使随后的所有其他测试失败。这会让你更难找到问题的根源,你不希望这样
如果您想测试多个调用之间的行为,您需要创建一个将这两个方法作为一个单元一起调用的测试,或者转到集成测试,在集成测试中您可以测试大量代码以确保正确工作
您的测试在逻辑上也是错误的,因为您正在递减该值。您(错误)的期望值将是0
,而不是2
- 每个带注释的
方法都独立运行,并带有新的重新初始化的@Test
值(ai
),因此1
失败test2
- 最好在一个测试中运行
和test1
,以检测正确的工作test2
结果(属于您的实际问题)。看一下代码清单Ai增量getAndIncrement()
- 此外,您还可以使用
而不是@Before
私有AtomicInteger ai=new AtomicInteger(1)代码>。因此,您以原子方式为每个测试确保分配的值
1
- 每个带注释的
方法都独立运行,并带有新的重新初始化的@Test
值(ai
),因此1
失败test2
- 最好在一个测试中运行
和test1
,以检测正确的工作test2
结果(属于您的实际问题)。看一下代码清单Ai增量getAndIncrement()
- 此外,您还可以使用
而不是@Before
私有AtomicInteger ai=new AtomicInteger(1)代码>。因此,您以原子方式为每个测试确保分配的值
1
private static AtomicInteger ai = new AtomicInteger(1);
但是您还有另一个问题-您不能保证test1将首先运行,test2将第二次运行。因此,您还需要牢记这一点重新编写测试,或者使用@TestMethodOrder(Alphanumeric.class)您可以将“static”添加到AtomicInteger初始化中,并且每个测试实例将使用相同的变量。像这样:
private static AtomicInteger ai = new AtomicInteger(1);
但是您还有另一个问题-您不能保证test1将首先运行,test2将第二次运行。因此,另外,您需要牢记这一点重新编写测试,或者使用类似@TestMethodOrder(Alphanumeric.class)的方法,如果您希望它递增,为什么要调用递减方法?呃,不确定您缺少了什么。对于同一个表达式(
ai.getAndDecrement()
),您同时声明了1和2。其中只有一个是正确的。仅供参考:是的,很抱歉键入错误,getAndIncrement
如果您希望它递增,为什么要调用递减方法?呃,不确定缺少什么。对于同一个表达式(ai.getAndDecrement()
),您同时声明了1和2。其中只有一个是正确的。参考:是的,很抱歉键入错误,getAndIncrement
很抱歉getAndIncrement,我是指getAndIncrement。您是指整个TestTest
类的新实例吗?与…what…AtomicInteger
的新实例相反?是的,当然是测试类的新实例。是的。好的,我理解,所以每个测试的运行方式就像它是类中唯一的测试一样。通过这种方式,它只测试它应该测试的内容,并且不受其他测试可能导致的任何副作用的影响。对不起getAndIncrement,我是说getAndIncrement。您是指整个TestTest
类的新实例吗?与…what…AtomicInteger
的新实例相反?是的,当然是测试类的新实例。是的。好的,我理解,所以每个测试的运行方式就像它是类中唯一的测试一样。这样一来,它只测试它应该测试的东西,并且对其他测试可能引起的任何副作用免疫。这确实有效。并且也同意让你们的测试互相依赖是一种不好的做法。这确实有效。并且也同意让你们的测试互相依赖是不好的做法。