java - Mockito 模拟测试嵌套函数调用

标签 java unit-testing junit mocking mockito

在嵌套函数调用的场景中,我在模拟测试方面遇到了严重的概念问题。我在我的项目中使用 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() 之类的基本方法,我们可以使用所需的 stub 创建所需参数的模拟(以支持执行正在测试的功能),然后执行和验证(状态/行为)。

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

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

最佳答案

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

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

关于java - Mockito 模拟测试嵌套函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17987289/

相关文章:

java - 在类之前和之后调用特定方法的通用测试类的设计 - 用于集成测试

java.io.FileNotFoundException :(Access is denied) convert byte array to image file

java - 如何为给定的每个命令行参数执行一段代码,但将其打印在一行中

java - 增强而不是覆盖 Maven 配置

java - 为什么我对这组代码的 JUnit 测试总是返回错误?

java - 如何使用 Allure 组织 junit 测试套件

java - jsp 重定向不起作用

unit-testing - NUnit 中约束模型相对于经典模型的优势?

unit-testing - Grails-操作方法-使用 Controller 参数的单元测试服务

Silverlight MVVM 单元测试说明