我正在尝试使用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”上有一个句柄,它在插入时作为参数传递...
当然我没有,因为它是在被测试方法的上下文中有条件地创建的。
任何人都曾经不得不处理这个并以某种方式解决了它?
感谢。
答案 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();
,方法调用的顺序也很重要,如果违反此规则,则会引发意外的方法调用。