我有下面的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
复制相似问题