验证完成后,EasyMock 在 tearDown 方法中验证对 mock 的调用
EasyMock verifying calls to mock in tearDown method after verify finished
我在 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 个问题...
- 为什么 2 个测试的行为不同?
- 为什么tearDown方法中的add(999L)在testB方法中的校验已经完全完成后还在校验?
(我知道我可以通过在验证(bMock)之后添加另一个重置(bMock)来完成这项工作,但我不确定这是否只是为了避免这个问题)
- 为什么 2 个测试的行为不同?
因为 AtomicLong.set
被键入 void AtomicLong.set(long)
所以它是一个无效的方法。录音很好。但是,List.add
的类型是 boolean List.add(E)
,因此它不是无效方法。记录非空方法的正确方法是 expect(list.add(101L)).andReturn(true)
.
- 为什么tearDown方法中的add(999L)在testB方法中的校验已经完全完成后还在校验?
因为它永远不会进入 testB()
。 EasyMock 在 setUp()
中对 bMock.add(101L)
的调用抛出错误,因此它直接转到 tearDown
也失败并隐藏到 setUp()
.
的异常
我在 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 个问题...
- 为什么 2 个测试的行为不同?
- 为什么tearDown方法中的add(999L)在testB方法中的校验已经完全完成后还在校验?
(我知道我可以通过在验证(bMock)之后添加另一个重置(bMock)来完成这项工作,但我不确定这是否只是为了避免这个问题)
- 为什么 2 个测试的行为不同?
因为 AtomicLong.set
被键入 void AtomicLong.set(long)
所以它是一个无效的方法。录音很好。但是,List.add
的类型是 boolean List.add(E)
,因此它不是无效方法。记录非空方法的正确方法是 expect(list.add(101L)).andReturn(true)
.
- 为什么tearDown方法中的add(999L)在testB方法中的校验已经完全完成后还在校验?
因为它永远不会进入 testB()
。 EasyMock 在 setUp()
中对 bMock.add(101L)
的调用抛出错误,因此它直接转到 tearDown
也失败并隐藏到 setUp()
.