如何对调用其他非虚函数的函数进行单元测试?

时间:2016-07-17 00:41:39

标签: unit-testing

我有几个功能来进行单元测试

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()和其他功能不是虚拟的)

2 个答案:

答案 0 :(得分:0)

就像测试private methods一样,您无法实际测试方法中的函数。无论内部发生什么事情,你都应该期望从函数Y得到结果X.

您正在测试的功能与其调用的功能之间存在一个未说明的合同,即确保一切都按预期工作。如果内部功能不应该按原样运行,那么外部功能也不会起作用,但在这种情况下,测试失败的原因不应该是您的测试的关注。

为内部函数创建测试,然后为调用它们的测试创建测试,这样您就可以轻松找到测试失败的原因。

答案 1 :(得分:0)

您的示例似乎建议了以下选项:

  • FuncX进行“全面”测试,包括对称为的功能的测试-这是不可取的,因为您已经测试了Func01等,并对FuncX进行了全面测试然后将重复所有这些测试。
  • 通过(以某种方式)对被调用函数FuncX等使用双精度来对Func01进行隔离测试。这很困难,因为被调用函数不是虚拟的。

但是,还有另一种选择:对具有依赖项的功能进行单元测试时,仅在依赖项引起麻烦时,您才需要对其进行处理。如果它不会造成麻烦,那么您可以忍受依赖。例如,如果某些代码依赖于编程语言的数学库(例如sin()函数),则这也是一种依赖关系-但是这种依赖关系几乎永远不会被double取代。

使用double的充分理由是,如果依赖项导致不确定的行为,需要花费很长的计算时间,存在错误或尚未实现或使某些测试方案难以执行-列举一些重要的方案。

但是,如果您的依赖项没有造成任何麻烦-只需对其进行单元测试。在您的示例中,只需忍受FuncX调用Func01等事实。只要您可以从结果中轻松确定FuncX是否工作正常(即哪个决定{{1} }),您可以测试FuncX以及是否已将FuncX和其他数字加倍。