JUnit Easymock意外方法调用

JUnit Easymock Unexpected method call

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

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

1
2
3
4
5
6
7
8
9
10
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 "上有一个句柄,该句柄在插入时作为参数传递。 ..
我不选择哪个,因为它是在要测试的方法的上下文中有条件创建的。

任何人都不得不处理这个问题并以某种方式解决了吗?

谢谢。


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


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

它可能比匹配确切的参数要严格一些,但是如果您对此满意,请尝试一下。在声明预期的方法调用时,请记住将强制类型转换为OtherObj


如果仅想通过此调用,anyObject()匹配器将非常有用,但是如果您实际上要验证构造的对象是否符合您的预期,则可以使用Capture。看起来像:

1
2
3
4
5
6
7
8
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可以期望构造一个对象,因此您可以根据需要进行研究。


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