我对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实例以进行测试呢?
发布于 2015-04-29 19:18:15
没有办法像您所描述的那样做到这一点;WhiteBox和类似的工具可以更改实例字段的值,因为它是持久的,但是只有在执行方法时堆栈上才存在方法变量,因此无法从方法外部访问或重置它。
因为Calculator是通过Guice注入的,所以可能有一个很好的注入点(方法、字段或构造函数),您可以在测试中调用自己来插入Calculator模拟。
您还可以重构以简化测试:
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);
}
}https://stackoverflow.com/questions/29924764
复制相似问题