首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Mockito WhiteBox在方法范围内设置成员变量

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

Stack Overflow用户
提问于 2015-04-28 16:21:23
回答 1查看 4.5K关注 0票数 1

我对Mockito还不熟悉,我正试图弄清楚是否有一种方法可以使用Mockito的WhiteBox特性在公共方法中设置一个成员变量的值。

我试着寻找这个,但似乎没有参考资料在谈论这个。

这可行还是不行。

谢谢

增加了一个我想要达到的目标的例子。考虑下一节课。

代码语言:javascript
复制
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实例以进行测试呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-29 19:18:15

没有办法像您所描述的那样做到这一点;WhiteBox和类似的工具可以更改实例字段的值,因为它是持久的,但是只有在执行方法时堆栈上才存在方法变量,因此无法从方法外部访问或重置它。

因为Calculator是通过Guice注入的,所以可能有一个很好的注入点(方法、字段或构造函数),您可以在测试中调用自己来插入Calculator模拟。

您还可以重构以简化测试:

代码语言:javascript
复制
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);
    }
}

甚至使该方法是静态的,这样就可以使用完全任意的值进行测试:

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29924764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档