在嵌套函数调用的场景中,我对模拟测试有一个严重的概念问题。我在我的项目中使用 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()
and之类的基本方法methodFour()
,我们可以创建带有所需存根的所需参数的模拟(以支持正在测试的函数的执行),然后执行和验证(状态/行为)。
但是,像这样的方法呢methodTwo()
,嵌套调用已经作为一个单独的单元测试过的其他函数。如果我们将模拟对象传递给methodTwo()
,它们将被传递给嵌套方法并给出NullPointerException()
,因为这些模拟没有根据嵌套函数调用的需要进行存根。当然,我们也可以为模拟添加额外的存根以支持嵌套调用中的平滑执行,但显然这不是一个健康的方法。随着我们使用大型方法(如methodOne()
或其他一些方法),这种存根的负担将进一步加重。
就单元测试而言,我们不关心被测试单元之外的其他单元。请指导我哪里错了,并提出更好/正确的单元和模拟测试方法。谢谢。