在过程完成之前将 mockito force 方法设置为 return 它的值

Make mockito force method to return its value before process finish

有没有办法在方法竞争之前将 mock 或 spy 对象从 mockito 变为 return 其值?例如,如果我有 class 这样的

public class Calculator{

    public List calculate(List l){
        l.add(1);
        l.add(2);
        method1(l);
        method2(l);
        method3(l);

        return l;
    }

    public void method1(List l){
        //calculate something here
    }

    public void method2(List l){
        //calculate something here
    }

    public void method3(List l){
        //calculate something here
    }
}

那我就这样用spy

Calculator calculator = new Calculator();
Calculator spy = spy(calculator);
when(spy.calculate(aList)).thenCallRealMethod();

我可以让方法在method2调用后结束它的进程吗?我知道我可以使用 doNothing().when(spy).method3(anyList()) 来避免方法 3 被调用,但是有没有什么方法可以让方法计算在方法 2 被调用后停止它的进程?

直接回答问题:不,您不能使用 Mockito 来完全避免方法调用或以其他方式深刻改变被测系统的行为。

在内部,Mockito 创建了一个有问题的 class 的动态子 class*。这正确地暗示除非您覆盖 Calculator.calculate(破坏测试 calculate 的实际实现的目的),否则您将无法使用 Mockito 来避免调用 method3.

您的最佳选择:

  • 按照评论中的讨论进行重构。
  • 按照您的建议使用 doNothing().when(spiedCalculator).method3()
  • method2 中抛出异常,避免调用 method3,尽管这会阻止流到达 method3 之后的函数部分。

*该实现实际上是使用 CGLib 或 ByteBuddy 生成的字节码代理 class。