我正在尝试测试一个类,它依赖于外部服务。此外部服务修改对象,并传递给它:
public void methodF(Op op) {
...
// op.operationId == 0
externalService.registerOp(op);
// op.operationId == 123456L
if (op.getOperationId() == 0) {
throw new CustomException();
}
}如果我模拟外部服务,它不会修改op,正在测试的整个方法会异常失败。
如何将模拟行为定义为假修改操作?
发布于 2014-09-17 16:03:15
您可以通过write an Answer为模拟方法提供任意实现。
doAnswer(new Answer<Void>()) {
@Override public Void answer(InvocationOnMock invocation) throws Throwable {
Op argument = (Op) invocation.getArguments()[0];
// Your code here
argument.operationId = 123456;
return null;
}
}).when(externalService).registerOp(any(Op.class));对于非空方法,也可以使用thenAnswer而不是doAnswer。
如果您发现自己一遍又一遍地写相同的答案,或者嘲笑同一个类上的许多操作,请考虑编写另一种实现(例如FakeExternalService或UnitTestExternalService),它直接对此操作进行存根处理,这很可能更容易读懂和更安全。
https://stackoverflow.com/questions/25891685
复制相似问题