在嵌套函数调用的场景中,我有一个严重的概念问题,即模拟测试。我在我的项目中使用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()
这样的基本方法,我们可以创建必需的params模拟并使用所需的存根(以支持被测函数的执行)并执行和验证(状态/行为)之后。
但是像methodTwo()
这样的方法呢,对已经作为单独单元进行测试的其他函数进行嵌套调用。如果我们将模拟对象传递给methodTwo()
,它们将被传递给嵌套方法并将给出NullPointerException()
,因为这些模拟不是根据嵌套函数调用的需要而存根的。当然,我们可以在模拟中添加额外的存根以支持嵌套调用中的顺利执行,但显然这不是一种健康的方法。当我们转向methodOne()
或其他一些大型方法时,这种存根负担会进一步恶化。
就单元测试而言,我们并不关心正在测试的其他单元。请指导我在哪里出错,并提出更好/正确的单元和模拟测试方法。感谢。
答案 0 :(得分:1)
我的想法是,methodOne
和methodTwo
每个都符合某种规范,就他们应该拥有的行为而言。您选择通过调用同一类的其他方法来实现这些方法的事实是无关紧要的;你应该测试他们的行为是否正确。因此,在编写测试时不要查看实现 - 而是查看规范。
当然,如果您选择忽略我的建议,您可以随时使用Mockito间谍,并在测试其他人时隐藏一些方法。但严重的是,不要。