make mockito force方法在进程结束前返回其值

时间:2015-09-22 22:52:32

标签: java junit mocking mockito

有没有办法让mockito的mock或spy对象在方法竞争之前返回它的值?例如,如果我有这样的课程

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
    }
}

然后我像这样使用间谍

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

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

1 个答案:

答案 0 :(得分:1)

直接回答这个问题:不,你不能使用Mockito来完全避免方法调用,或者深刻改变被测系统的行为。

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

您最好的选择:

  • 在评论中讨论的重构。
  • 按照建议使用doNothing().when(spiedCalculator).method3()
  • method2中抛出一个例外,以避免调用method3,但这会阻止流量在method3之后到达函数的一部分。

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