JUnit Easymock意外的方法调用

Lan*_*lot 6 methods junit easymock call

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

这是我正在尝试测试的方法的简化版本:

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);
    }
    //(...)
}
Run Code Online (Sandbox Code Playgroud)

好的,所以使用EasyMock我已经嘲笑了这个service.getObj(myObj)电话,并且工作正常.

我的问题出现在JUnit遇到dao.insert(otherObj)调用时.EasyMock抛出了*Unexpected Method Call*它.

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

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

谢谢.

dpl*_*ass 14

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


Doc*_*uss 9

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

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


jhe*_*cks 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));
Run Code Online (Sandbox Code Playgroud)

此外,PowerMock能够期望构建一个对象,因此您可以根据需要进行调查.