Junit 使用Mockito WhiteBox在方法范围内设置成员变量
我是Mockito的新手,正在尝试找出是否有一种方法可以使用Mockito的白盒特性在公共方法中设置成员变量的值 我试着搜索这个,但似乎没有参考文献在谈论这个 这是否可行 谢谢 添加了一个我想要实现的示例。考虑下面的类。Junit 使用Mockito WhiteBox在方法范围内设置成员变量,junit,mockito,Junit,Mockito,我是Mockito的新手,正在尝试找出是否有一种方法可以使用Mockito的白盒特性在公共方法中设置成员变量的值 我试着搜索这个,但似乎没有参考文献在谈论这个 这是否可行 谢谢 添加了一个我想要实现的示例。考虑下面的类。 public class FinancialsCalculator { private int va11; private int val2; public int calculateFinancialsAppliedSum() {
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类实例
如果它在FinancialCalculator类级别(即与val1和val2变量处于同一级别),我可以轻松模拟它,并使用mockito的Whitebox.setInternalState()将模拟实例设置为该类级别的Calculator私有实例
不幸的是,由于其他原因,我无法使此计算器实例成为FinancialCalculator类的类级私有实例。它必须在calculateFinancialsAppliedSum方法中
那么,如何在calculateFinancialsAppliedSum方法中模拟这个计算器实例进行测试呢 没有办法像你描述的那样做到这一点;WhiteBox和类似的工具可以更改实例字段的值,因为它是持久的,但方法变量仅在方法执行时存在于堆栈上,因此无法从方法外部访问或重置它 因为计算器是通过Guice注入的,所以可能有一个很好的注入点(方法、字段或构造函数),您可以在测试中调用它来插入计算器模拟 您还可以重构以简化测试:
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);
}
}
“在公共方法内部”对我来说似乎并不清楚。你能添加一个例子,或者演示一个符合你需要的
虚拟HiteBox
吗?@JeffBowman添加了一个我想要实现的例子WhiteBox是PowerMock的一部分而不是Mockito。计算器是如何注入的?字段注入、setter注入、构造函数注入?