这是我对单元测试时我们视为“单位”的疑问。
说我有这样的方法,
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()的失败可能会显示不正确 - 错误的位置。
导致两次测试失败的原因对我来说并不是那么好看。但是,如果有更好的方法,不要...?有吗?
谢谢!
答案 0 :(得分:5)
您希望在不测试依赖关系的情况下测试myBigMethod的逻辑。
看起来myBigMethod的规格是:
测试这种行为的关键是打破对moduleOneObject和moduleTwoObject的依赖。通常,这是通过将依赖项传递到构造函数中的测试类(构造函数注入)或通过属性(setter注入)设置它们来完成的。
问题不仅仅是学术问题,因为在实践中,moduleOneObject和moduleTwoObject可能会出现并触及外部系统,例如数据库。真正的单元测试不会影响外部系统,因为它会使其成为“集成测试”。
答案 1 :(得分:2)
myBigMethod()
的测试应该测试其他两个方法的结果的组合。所以,是的,如果它所依赖的方法中的任何一个失败,它应该失败,但它应该测试更多。在某些情况下,someOperation()
和someOtherOperation()
可以正常工作,但myBigMethod()
仍然可能失败。如果那是不可能的,则无需测试myBigMethod()
。