Gli*_*ide 54 unit-testing easymock
使用andReturn(T value)vs andStubReturn(T value)for EasyMock有什么区别?
在什么情况下你会使用andStubReturn()哪里andReturn()无法达到相同的结果?
Bar*_*end 56
您可以在模拟上使用存根返回来进行方法调用,但是您不会对此感兴趣.您可以使用常规返回进行"常规"方法调用.
请考虑以下方法:
public void someMethod(String arg) {
if (logger.isDebugEnabled()) {
logger.debug("Calling doSomething() on service "
+ service.getName().hashCode());
}
service.postMessage("{" + arg + "}");
if (logger.isDebugEnabled()) {
logger.info("Finished calling doSomething() on service "
+ service.getName().hashCode());
}
}
Run Code Online (Sandbox Code Playgroud)
......哪里service是一个可模仿的领域.该hashCode()日志报表的事情是做作,但问题是,你的模拟需要到任意数量的呼叫响应getName(),以避免NPE,而你不能,否则不太关心它.
在为此方法编写基于EasyMock的单元测试时,您可以andStubReturn()拨打电话getName()并使用正常andReturn()呼叫postMessage(String).验证模拟对象时,它只会考虑后者,如果更改log4j配置,则测试不会中断.
小智 5
附加说明为清晰起见.
如果您使用.andStubReturn()(或者如果您使用.andReturn(foo).anyTimes()),则不会有最小预期呼叫计数.因此,如果使用这两个中的任何一个设置模拟期望,并且未调用模拟方法,则.verify()调用将不会断言.
不调用mocked方法时不会断言的示例;
FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andStubReturn(true);
EasyMock.replay(myFooClass);
EasyMock.verify(myFooClass);
Run Code Online (Sandbox Code Playgroud)
在未调用mocked方法时将断言的示例;
FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andReturn(true).atLeastOnce();
EasyMock.replay(myFooClass);
EasyMock.verify(myFooClass);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30212 次 |
| 最近记录: |