我的单元测试包含对我的DAO的“严格”模拟。除了下面的@Test之外,我的模拟行为对于所有测试都是通用的。因此,我在@Before方法中添加了这种常见的模拟行为。然后将专家模拟行为添加到@Test本身:
@Before
public void setUp() {
reset(myDAO);
expect(myDAO.findMyObjects(code, myID)).andReturn(myObjects).times(1);
expect(myDAO.findMyObjects(myID)).andReturn(myObjects).times(1);
replay(myDAO);
}
@Test
public void testMyFirstMethod() {
reset(myDAO);
expect(myDAO.findMyObjects(myID)).andReturn(new ArrayList<MyObject>()).times(200);
replay(myDAO);
Set<OtherObject> otherObjects = myTestClass.myTestMethod(null, myID);
assertEquals("Empty set is returned", 0, otherObjects.size());
}
我已经检查过.times(1)行为在我的其他单元测试中得到了验证。但是,在上面的测试中,没有验证.times(200)行为(因为我的单元测试只调用一次)。 这是为什么?
答案 0 :(得分:3)
您需要使用EasyMock.verify(myDAO)
告诉EasyMock重播已完成,现在应该满足期望。
当你只调用myTestMethod
一次时,EasyMock不知道它必须在方法完成之前检查myDAO
,所以它等待更多的调用,然后方法成功返回而没有EasyMock注意到findMyObjects
没有被召唤足够多次。
至于为什么times(1)
行为得到验证,我不确定,但我怀疑验证可能会被其他测试触发。
那就是说,你的@Before方法组织真的没有了。您正在设定期望,开始重播,重置,然后再次重播?