我有下面的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
passes和test2
在以下消息中失败:
java.lang.AssertionError:
Expected :2
Actual :1
发布于 2018-03-13 08:18:51
这些测试是在新实例上运行的。test1()
的行为不会以任何方式影响test2()
,否则它可能导致单个失败的测试失败,所有其他测试都会随之失败。这会使你更难找出问题的根源,而你不想这样做。
如果您想测试多个调用之间的行为,您需要创建一个测试,将这两个方法作为一个单元一起调用,或者继续进行集成测试,在那里您可以测试更多的代码以确保正确工作。
您的测试在逻辑上也是错误的,因为您正在减少值。您(错误地)的期望值将是0
而不是2
。
发布于 2018-03-13 08:38:56
@Test
注释的方法使用新的重新初始化的ai
值(1
)运行索引,因此test2
失败。test1
和test2
,以检测正确的工作getAndIncrement()
结果(属于实际问题)。看一看代码列出的Ai-增量。
//*代码清单: ai -递增*私有AtomicInteger ai;@ public (){ai=新的AtomicInteger(1);}} @ Test () { assertEquals(1,ai.getAndIncrement();assertEquals(2,ai.getAndIncrement());}@Before
而不是private AtomicInteger ai = new AtomicInteger(1);
。因此,您可以确保每个测试的赋值1
都是原子的。发布于 2021-06-17 11:54:33
您可以在AtomicInteger初始化中添加“静态”,每个测试实例都将使用相同的变量。如下所示:
private static AtomicInteger ai = new AtomicInteger(1);
但是,您还有另一个问题--您不能保证test1将首先运行,test2将运行第二。因此,您还需要考虑到这一点重新编写测试,或者使用@TestMethodOrder(Alphanumeric.class)之类的方法。
https://stackoverflow.com/questions/49251258
复制相似问题