我的单元测试包含我的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)行为未得到验证(因为我的单元测试仅调用了一次)。
为什么是这样?
最佳答案
您需要使用EasyMock.verify(myDAO)
告诉EasyMock重播已完成,并且现在应该满足期望。
当您仅调用myTestMethod
一次时,EasyMock不知道它必须在方法完成之前检查myDAO
,因此它等待更多调用,然后该方法成功返回,而EasyMock并未注意到findMyObjects
叫了足够的次数。
至于为什么times(1)
行为得到验证,我不确定,但是我怀疑验证可能是由其他测试触发的。
就是说,您的@Before方法组织真的关闭了。您是在设定期望,开始重播,重设,然后再次重播?