Unit testing JUnit—测试一个方法,该方法反过来调用更多的方法

Unit testing JUnit—测试一个方法,该方法反过来调用更多的方法,unit-testing,junit,Unit Testing,Junit,这是我对单元测试时我们所认为的“单元”的怀疑 假设我有一个这样的方法 public String myBigMethod() { String resultOne = moduleOneObject.someOperation(); String resultTwo = moduleTwoObject.someOtherOperation(resultOne); return resultTwo; } (我分别为s

这是我对单元测试时我们所认为的“单元”的怀疑

假设我有一个这样的方法

public String myBigMethod()
      {
         String resultOne = moduleOneObject.someOperation(); 
         String resultTwo = moduleTwoObject.someOtherOperation(resultOne);
         return resultTwo;
      }
(我分别为someOperation()和someOtherOperation()编写了单元测试)

这个myBigMethod()通过如上所述的方式集成了ModuleOne和ModuleTo

那么,方法“myBigMethod()”是否仍然被视为一个“单元”

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

假设我已经为myBigMethod()编写了一个测试。。。如果testSomeOperation()失败,还将导致testMyBigMethod()失败。。。现在testMyBigMethod()的失败可能显示错误的位置不太正确

导致两次测试失败的一个原因在我看来不太好。但唐诺,如果有更好的办法。。。?有吗


谢谢

您希望测试myBigMethod的逻辑,而不测试依赖项

看起来myBigMethod的规范是:

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


    这个问题不仅仅是学术性的,因为在实践中,moduleNoObject和moduleWoObject可能会攻击外部系统,比如数据库。真正的单元测试不会影响外部系统,因为这将使其成为“集成测试”。

    您希望测试myBigMethod的逻辑,而不测试依赖项

    看起来myBigMethod的规范是:

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


    这个问题不仅仅是学术性的,因为在实践中,moduleNoObject和moduleWoObject可能会攻击外部系统,比如数据库。真正的单元测试不会影响外部系统,因为这会使它成为一个“集成测试”。
    myBigMethod()
    的测试应该测试调用的其他两个方法的结果的组合。所以,是的,如果它所依赖的任何一种方法失败,它都应该失败,但它应该进行更多的测试。在某些情况下,
    someOperation()
    someOtherOperation()
    工作正常,但
    myBigMethod()
    仍可能失败。如果不可能,则无需测试
    myBigMethod()

    myBigMethod()
    的测试应测试调用的其他两种方法的结果的组合。所以,是的,如果它所依赖的任何一种方法失败,它都应该失败,但它应该进行更多的测试。在某些情况下,
    someOperation()
    someOtherOperation()
    工作正常,但
    myBigMethod()
    仍可能失败。如果这不可能,那么就没有必要测试
    myBigMethod()

    您没有在显示的代码中组合结果。我使用了someOperationOne()的结果作为someOtherOperation()的参数噢,对不起,我没有听清楚。您没有在显示的代码中组合结果。我使用了someOperationOne()的结果作为someOtherOperation()的参数噢,对不起,我没有听清楚。