JUnit - 测试一个方法,该方法又调用更多方法

时间:2010-05-21 20:53:10

标签: unit-testing junit

这是我对单元测试时我们视为“单位”的疑问。

说我有这样的方法,

public String myBigMethod()
      {
         String resultOne = moduleOneObject.someOperation(); 
         String resultTwo = moduleTwoObject.someOtherOperation(resultOne);
         return resultTwo;
      }

(我为someOperation()和someOtherOperation()分别编写单元测试

这个myBigMethod()有点像上面那样使用它们集成了ModuleOne和ModuleTwo,

那么,方法“myBigMethod()”仍被视为“单位”吗?

我应该为这个“myBigMethod()”写一个测试吗?

说我已经为myBigMethod()写了一个测试...如果testSomeOperation()失败,它也会导致testMyBigMethod()失败......现在testMyBigMethod()的失败可能会显示不正确 - 错误的位置。

导致两次测试失败的原因对我来说并不是那么好看。但是,如果有更好的方法,不要...?有吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

您希望在不测试依赖关系的情况下测试myBigMethod的逻辑。

看起来myBigMethod的规格是:

  1. 调用moduleOneObject.someOperation
  2. 将结果传递给moduleTwoObject.someOtherOperation
  3. 返回结果
  4. 测试这种行为的关键是打破对moduleOneObject和moduleTwoObject的依赖。通常,这是通过将依赖项传递到构造函数中的测试类(构造函数注入)或通过属性(setter注入)设置它们来完成的。

    问题不仅仅是学术问题,因为在实践中,moduleOneObject和moduleTwoObject可能会出现并触及外部系统,例如数据库。真正的单元测试不会影响外部系统,因为它会使其成为“集成测试”。

答案 1 :(得分:2)

myBigMethod()的测试应该测试其他两个方法的结果的组合。所以,是的,如果它所依赖的方法中的任何一个失败,它应该失败,但它应该测试更多。在某些情况下,someOperation()someOtherOperation()可以正常工作,但myBigMethod()仍然可能失败。如果那是不可能的,则无需测试myBigMethod()