6

我正在尝试在带有 EasyMock 的 JUnit 中设置测试,但遇到了一个小问题,我似乎无法解决这个问题。我希望这里有人可以提供帮助。

这是我要测试的方法的简化版本:

public void myMethod() {
    //(...)
    Obj myObj = this.service.getObj(param);
    if (myObj.getExtId() != null) {
      OtherObj otherObj = new OtherObj();
      otherObj.setId(myObj.getExtId());
      this.dao.insert(otherObj);
    }
    //(...)
}

好的,所以使用 EasyMock 我已经模拟了service.getObj(myObj)通话并且效果很好。

当 JUnitdao.insert(otherObj调用 ) 时,我的问题就出现了。EasyMock*Unexpected Method Call*在上面抛出一个。

我不介意在我的测试中嘲笑那个 dao 并使用expectLastCall().once();它,但假设我有一个句柄,它在插入时作为参数传递......我当然不这样做,因为它是有条件的在被测试的方法的上下文中创建。

任何人都必须处理这个问题并以某种方式解决它?

谢谢。

4

4 回答 4

14

您还可以使用EasyMock.isA(OtherObj.class)更多的类型安全性。

于 2010-05-31T01:13:28.343 回答
9

如果您无法在测试代码中获得对对象本身的引用,则可以将EasyMock.anyObject()其用作方法的预期参数insert。顾名思义,它将期望使用.. 任何对象调用该方法:)

它可能比匹配确切的论点不那么严格,但是如果您对此感到满意,请试一试。请记住OtherObj在声明预期的方法调用时包含强制转换。

于 2010-01-22T09:23:51.950 回答
5

如果您只是想通过此调用,anyObject() 匹配器非常有用,但如果您真的想验证构造的对象是您认为的那样,您可以使用 Capture。它看起来像:

Capture<OtherObj> capturedOtherObj = new Capture<OtherObj>();
mockDao.insert(capture(capturedOtherObj));
replay(mockDao);

objUnderTest.myMethod();

assertThat("captured what you expected", capturedOtherObj.getValue().getId(), 
           equalTo(expectedId));

此外,PowerMock能够期望构造一个对象,因此如果需要,您可以查看它。

于 2011-01-29T05:25:30.637 回答
1

另请注意,如果您使用EasyMock.createStrictMock();,方法调用的顺序也很重要,如果您违反此规则,则会引发意外的方法调用。

于 2016-09-20T12:18:00.850 回答