我在 EasyMock 测试中看到我不理解的不一致行为。
我的第一个测试通过了..
public class MockATest {
private final AtomicLong aMock = createStrictMock(AtomicLong.class);
@Before
public void setUp() {
aMock.set(101L);
}
@After
public void tearDown() {
aMock.set(999L);
}
@Test
public void testA() {
reset(aMock);
replay(aMock);
// TODO : test stuff here
verify(aMock);
}
}
.. 但我的第二次测试失败了......
public class MockBTest {
private final List<Long> bMock = createStrictMock(List.class);
@Before
public void setUp() {
bMock.add(101L);
}
@After
public void tearDown() {
bMock.add(999L);
}
@Test
public void testB() {
reset(bMock);
replay(bMock);
// TODO : test stuff here
verify(bMock);
}
}
失败原因是
Unexpected method call List.add(999)
我真的有两个问题......
- 为什么 2 个测试的行为不同?
- 为什么在testB方法中验证已经完全完成后,tearDown方法中发生的add(999L)还在验证?
(我知道我可以通过在验证(bMock)之后添加另一个重置(bMock)来完成这项工作,但我不确定这是否只是为了避免这个问题)
最佳答案
- 为什么 2 个测试的行为不同?
因为 AtomicLong.set
的类型是 void AtomicLong.set(long)
所以它是一个 void 方法。录音很好。但是,List.add
的类型为 boolean List.add(E)
,因此它不是无效方法。记录非 void 方法的正确方法是执行 expect(list.add(101L)).andReturn(true)
。
- 为什么在testB方法中验证已经完全完成后,tearDown方法中发生的add(999L)还在验证?
因为它永远不会进入 testB()
。 EasyMock 在 setUp()
中调用 bMock.add(101L)
时抛出错误,因此它直接转到 tearDown
也失败了并隐藏 setUp()
的异常。
关于java - 验证完成后,EasyMock 在 tearDown 方法中验证对 mock 的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57413783/