Mockito:定义模拟行为

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),它直接存根这个操作,这可能更具可读性和更安全类型.