【问题标题】:Mockito: define mock behaviourMockito:定义模拟行为
【发布时间】:2014-09-17 13:16:24
【问题描述】:

我正在尝试测试一个依赖于外部服务的类。这个外部服务修改对象,传递给它:

public void methodF(Op op) {

    ...

    // op.operationId == 0

    externalService.registerOp(op);

    // op.operationId == 123456L

    if (op.getOperationId() == 0) {
        throw new CustomException();
    }

}

如果我模拟外部服务,它不会修改操作,并且正在测试的整个方法会因异常而失败。

如何定义模拟行为来伪造修改操作?

【问题讨论】:

    标签: unit-testing mocking mockito


    【解决方案1】:

    您可以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));
    

    对于非 void 方法,您也可以使用 thenAnswer 代替 doAnswer

    如果您发现自己一遍又一遍地编写相同的答案,或者在同一个类上模拟许多操作,请考虑编写一个替代实现(例如 FakeExternalService 或 UnitTestExternalService)直接存根此操作,这可能更具可读性和更多类型-安全。

    【讨论】:

    • +1 或将Op 设为接口类型并模拟返回ID 值的调用。
    • @Duncan 这主意不错,但看起来 Op 可能是一个数据对象,而模拟数据对象可能既费力又徒劳。 ExternalService 这里是直接合作者,无论如何都需要被嘲笑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2014-06-16
    相关资源
    最近更新 更多