Den*_*gin 1 unit-testing mocking mockito
我正在尝试测试一个类,这取决于外部服务.此外部服务修改传递给它的对象:
public void methodF(Op op) {
...
// op.operationId == 0
externalService.registerOp(op);
// op.operationId == 123456L
if (op.getOperationId() == 0) {
throw new CustomException();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我模拟外部服务,它不会修改操作,并且正在测试的整个方法会因异常而失败.
如何定义模拟行为来伪造修改操作?
Jef*_*ica 10
您可以编写一个Answer来为mock方法提供任意实现.
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));
Run Code Online (Sandbox Code Playgroud)
对于非void方法,您也可以使用thenAnswer而不是doAnswer.
如果您发现自己一遍又一遍地编写相同的答案,或者在同一个类上模拟许多操作,请考虑编写一个替代实现(例如FakeExternalService或UnitTestExternalService),它直接存根这个操作,这可能更具可读性和更安全类型.