繁体   English   中英

使模仿力方法在处理完成之前返回其值

[英]Make mockito force method to return its value before process finish

在方法竞争之前,是否有一种方法可以使模拟对象中的模拟对象或间谍对象返回其值? 例如,如果我有这样的课程

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之后停止其进程?

要直接回答这个问题:不,您不能使用Mockito完全避免方法调用,否则将深刻改变被测系统的行为。

在内部,Mockito创建所涉及类的动态子类*。 这正确地暗示着,除非您重写Calculator.calculate (违反测试calculate实际实现的目的),否则您将无法使用Mockito来避免调用method3

您的最佳选择:

  • 按照评论中的说明进行重构。
  • 根据您的建议使用doNothing().when(spiedCalculator).method3()
  • method2中引发一个异常,该异常避免了对method3的调用,尽管这可以防止流到达method3之后的函数部分。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM