我是Mockito的新手,正在尝试了解是否有一种方法可以使用Mockito中的WhiteBox功能在公共方法中设置成员变量的值。
我试着搜索这个,但似乎没有参考资料在谈论这个。
这可行与否。
感谢
添加了一个我想要实现的目标的例子。考虑以下类。
public class FinancialsCalculator {
private int va11;
private int val2;
public int calculateFinancialsAppliedSum() {
//In actual application this calc get's Injected using Guice
Calculator calc;
//Some pre-processing to the values val1 and val2 will be performed here
return calc.getSum(val1, val2);
}
}
现在我需要对上面的类进行单元测试。我想模拟calculateFinancialsAppliedSum方法范围内的Calculator类实例。
如果它在FinancialsCalculator类级别(即与val1和val2变量处于同一级别),我可以很容易地对它进行模拟,并使用mockito的Whitebox.setInternalState()将模拟实例设置为Calculator的类级别私有实例。
不幸的是,由于其他原因,我无法将此Calculator实例作为FinancialsCalculator类的类级私有实例。它必须在calculateFinancialsAppliedSum方法中。
那么,我如何在calculateFinancialsAppliedSum方法中模拟这个Calculator实例进行测试呢?
没有办法像您所描述的那样做到这一点;WhiteBox和类似的工具可以更改实例字段的值,因为它是持久的,但方法变量只有在方法执行时才存在于堆栈上,因此无法从方法外部访问或重置它。
因为Calculator是通过Guice注入的,所以可能有一个很好的注入点(方法、字段或构造函数),您可以在测试中调用它来插入Calculator mock。
您还可以进行重构以使测试更容易:
public class FinancialsCalculator {
private int va11;
private int val2;
public int calculateFinancialsAppliedSum() {
return calculateFinancialsAppliedSum(calc);
}
/** Uses the passed Calculator. Call only from tests. */
@VisibleForTesting int calculateFinancialsAppliedSum(Calculator calc) {
//Some pre-processing to the values val1 and val2 will be performed here
return calc.getSum(val1, val2);
}
}
或者甚至使方法静态,以便可以使用完全任意的值进行测试:
public class FinancialsCalculator {
private int va11;
private int val2;
public int calculateFinancialsAppliedSum() {
return calculateFinancialsAppliedSum(calc, val1, val2);
}
/** Uses the passed Calculator, val1, and val2. Call only from tests. */
@VisibleForTesting static int calculateFinancialsAppliedSum(
Calculator calc, int val1, int val2) {
//Some pre-processing to the values val1 and val2 will be performed here
return calc.getSum(val1, val2);
}
}