在过程完成之前将 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。
有没有办法在方法竞争之前将 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。