我有以下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
答案 0 :(得分:5)
测试在新实例上运行。 test1()
的行为不会以任何方式影响test2()
,否则可能会导致单个失败的测试失败,导致其后的所有其他测试失败。这将使得更难找出问题的根源,而你却不想这样做。
如果您想测试多个调用之间的行为,您需要创建一个将这两个方法作为一个单元一起调用的测试,或者继续进行集成测试,您可以在其中测试大量代码正确的工作。
您的测试在逻辑上也是错误的,因为您正在递减该值。您的(错误的)预期值为0
而不是2
。
答案 1 :(得分:1)
@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
。
答案 2 :(得分:1)
您可以将“静态”添加到您的 AtomicInteger 初始化中,并且每个测试实例将使用相同的变量。像这样:
private static AtomicInteger ai = new AtomicInteger(1);
但是您还有另一个问题——您不能保证首先运行 test1,然后运行 test2。因此,您还需要考虑到这一点重新编写测试或使用类似 @TestMethodOrder(Alphanumeric.class)