【问题标题】:EasyMock: Times behaviour not being checked for strict mockEasyMock:没有检查严格模拟的时间行为
【发布时间】:2012-02-24 02:35:31
【问题描述】:

我的单元测试包含对我的 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) 行为没有得到验证(因为我的单元测试只调用了一次)。 这是为什么呢?

【问题讨论】:

    标签: java easymock


    【解决方案1】:

    您需要使用EasyMock.verify(myDAO) 告诉EasyMock 回放已完成,现在应该满足期望。

    当你只调用一次myTestMethod 时,EasyMock 不知道它必须在方法完成之前检查myDAO,所以它等待更多的调用,然后方法成功返回,而 EasyMock 没有注意到findMyObjects调用次数不够。

    至于为什么 times(1) 行为得到验证,我不确定,但我怀疑验证可能是由其他测试触发的。

    也就是说,您的 @Before 方法组织确实不正常。您是在设定预期、开始重播、重置,然后再次重播?

    【讨论】:

    • 好的,有两个问题: 1. verify 应该放在我的 assertEquals 之后吗? 2. 为什么我的其他测试不需要验证,只需要这个?
    • verify 应该在你调用了你期望被调用的模拟对象上的所有方法之后放置。 (这可以在您的 assertEquals.) I have no idea why your other tests were working, although your @Before` 方法之前或之后,这似乎有点令人困惑和设计错误,这可能会抛出各种问题。
    • 好的,谢谢,为什么说设计错误?我将这种行为包含在其中,因为它在我的班级中的所有其他测试中都很常见。
    • 对于@Before 方法来说,它似乎非常令人惊讶来做一些属于测试本身的事情。我希望@Before 方法只是初始化所有变量等,而不是执行我的测试中的逻辑。这似乎是一种代码味道,表明应该以其他方式重新组织测试。
    • 好的,谢谢您的建议。我已经被 @Before 注释删除了,现在我只在我真正需要它时才调用该模拟行为,而不是在每次测试之前。也许,EasyMock 不喜欢在 Before 或 After 方法中指定模拟,因为我看到了一些奇怪的行为
    猜你喜欢
    • 1970-01-01
    • 2021-05-06
    • 2014-07-02
    • 2012-03-05
    • 2011-03-09
    • 2014-08-29
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    相关资源
    最近更新 更多