【问题标题】:Mockito mock testing for nested functions calls嵌套函数调用的 Mockito 模拟测试
【发布时间】:2013-08-01 07:05:21
【问题描述】:

在嵌套函数调用的场景中,我对模拟测试有一个严重的概念问题。我在我的项目中使用 JUnit 和 Mockito。让我用下面的例子来解释我的问题:-

public class ClassA {
        public void methodOne(param1, param2, param3, param4) {
            // do something

            String temp = methodTwo(param2, param3, param4);

            // do something
        }

        public String methodTwo(param2, param3, param4) {
            // do something

            return methodThree(param2, param3) + methodFour(param4);
        }

        public String methodThree(param2, param3) {
            // do something
            return param2.get(0).getIndex + ":" + param3.getPosition();
        }

        public String methodFour(param4) {
            // do something

            return param4.getDetail() + "|" + param4.getCount();
        }
    }

如果我们必须测试methodThree()methodFour() 之类的基本方法,我们可以创建带有所需存根的所需参数的模拟(以支持正在测试的函数的执行)并进行执行和验证(状态/行为) 之后。

但是像methodTwo() 这样的方法呢?嵌套调用已经作为一个单独的单元测试过的其他函数。如果我们将模拟对象传递给methodTwo(),它们将被传递给嵌套方法并给出NullPointerException(),因为这些模拟没有根据嵌套函数调用的需要进行存根。当然,我们也可以为模拟添加额外的存根以支持嵌套调用中的平滑执行,但显然这不是一个健康的方法。随着我们使用methodOne() 或其他一些大型方法,这种存根负担将进一步加重。

就单元测试而言,我们不关心被测试单元之外的其他单元。请指导我哪里错了,并提出更好/正确的单元和模拟测试方法。谢谢。

【问题讨论】:

    标签: java unit-testing junit mocking mockito


    【解决方案1】:

    我的想法是methodOnemethodTwo 各自满足某种规范,就它们应该具有的行为而言。您选择通过调用同一类的其他方法来实现这些的事实是无关紧要的;您应该测试他们的行为是否正确。因此,在编写测试时不要查看实现,而是查看规范。

    当然,如果您选择忽略我的建议,您可以随时使用 Mockito 间谍,并在测试其他方法时删除一些方法。但说真的,不要。

    【讨论】:

    • 大卫,我同意你的建议。现在,如果我在这里错了,请纠正我——行为测试是关于确保被测试的方法遵循一组预期的语句。这是确保所需行为或规范所必需的。我们如何在不关心函数内完成的实际实现的情况下实现这一点。您是指“查看规范”一词的状态验证吗?请澄清并提供适当的参考资料(如果有)以填补我的知识空白。谢谢。
    猜你喜欢
    • 2017-06-03
    • 2020-06-09
    • 2018-04-28
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    相关资源
    最近更新 更多