Junit 使用Mockito WhiteBox在方法范围内设置成员变量

Junit 使用Mockito WhiteBox在方法范围内设置成员变量,junit,mockito,Junit,Mockito,我是Mockito的新手,正在尝试找出是否有一种方法可以使用Mockito的白盒特性在公共方法中设置成员变量的值 我试着搜索这个,但似乎没有参考文献在谈论这个 这是否可行 谢谢 添加了一个我想要实现的示例。考虑下面的类。 public class FinancialsCalculator { private int va11; private int val2; public int calculateFinancialsAppliedSum() {

我是Mockito的新手,正在尝试找出是否有一种方法可以使用Mockito的白盒特性在公共方法中设置成员变量的值

我试着搜索这个,但似乎没有参考文献在谈论这个

这是否可行

谢谢

添加了一个我想要实现的示例。考虑下面的类。

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注入、构造函数注入?