我有几个功能来进行单元测试
public class MyClass {
public DataObj FuncX (int input1, int input2) {
if( input1 < 0 && input2 > 0 ){
return Func01();
}
else if(input1 < 2 && input2 < 0) {
return Func02();
}
....
return Func0N();
}
}
我已经为Func01()
,Func02()
等功能进行了多项单元测试,但我不知道如何对FuncX()
进行单元测试。
(注意:Func01()
和其他功能不是虚拟的)
答案 0 :(得分:0)
就像测试private methods一样,您无法实际测试方法中的函数。无论内部发生什么事情,你都应该期望从函数Y得到结果X.
您正在测试的功能与其调用的功能之间存在一个未说明的合同,即确保一切都按预期工作。如果内部功能不应该按原样运行,那么外部功能也不会起作用,但在这种情况下,测试失败的原因不应该是您的测试的关注。/ p>
为内部函数创建测试,然后为调用它们的测试创建测试,这样您就可以轻松找到测试失败的原因。
答案 1 :(得分:0)
您的示例似乎建议了以下选项:
FuncX
进行“全面”测试,包括对称为的功能的测试-这是不可取的,因为您已经测试了Func01
等,并对FuncX
进行了全面测试然后将重复所有这些测试。FuncX
等使用双精度来对Func01
进行隔离测试。这很困难,因为被调用函数不是虚拟的。但是,还有另一种选择:对具有依赖项的功能进行单元测试时,仅在依赖项引起麻烦时,您才需要对其进行处理。如果它不会造成麻烦,那么您可以忍受依赖。例如,如果某些代码依赖于编程语言的数学库(例如sin()
函数),则这也是一种依赖关系-但是这种依赖关系几乎永远不会被double取代。
使用double的充分理由是,如果依赖项导致不确定的行为,需要花费很长的计算时间,存在错误或尚未实现或使某些测试方案难以执行-列举一些重要的方案。
但是,如果您的依赖项没有造成任何麻烦-只需对其进行单元测试。在您的示例中,只需忍受FuncX
调用Func01
等事实。只要您可以从结果中轻松确定FuncX
是否工作正常(即哪个决定{{1} }),您可以测试FuncX
以及是否已将FuncX
和其他数字加倍。