JUnit Easymock意外的方法调用

时间:2010-01-21 23:30:09

标签: junit methods call easymock

我正在尝试使用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)来电并且运行正常。

当JUnit点击dao.insert(otherObj)电话时出现问题。 EasyMock会在其上抛出*Unexpected Method Call*

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

任何人都曾经不得不处理这个并以某种方式解决了它?

感谢。

4 个答案:

答案 0 :(得分:14)

您还可以使用EasyMock.isA(OtherObj.class)来提高安全性。

答案 1 :(得分:9)

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

它可能不如匹配确切的参数那么严格,但如果你对它感到满意,那就给它一个旋转。请记住在声明预期的方法调用时将强制转换包含到OtherObj

答案 2 :(得分: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能够期望构建一个对象,所以你可以根据需要调查它。

答案 3 :(得分:1)

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