我的单元测试包含我的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方法组织真的关闭了。您是在设定期望,开始重播,重设,然后再次重播?

09-25 21:55