我有一个具有依赖项B
的类A
。
我给B::foo(String s1, String s2)
写了一篇UT。假设我测试B::foo("a", "a")
流
假设A::foo(..)
调用B::foo(..)
我必须写一份A::("a", "a")
的UT吗?
我会注入B::foo mock,并检查它是否被调用过一次,并且在给定来自B的模拟结果的情况下,来自A的结果也是预期的。
在这种情况下你会避免嘲笑吗?
你会避免整个流程吗,因为它已经在B
UT中检查过了?
单元测试是抵御软件错误的额外防线。很可能在生产代码中产生错误,在和单元测试中产生相同错误的可能性要小得多。这就是您编写单元测试的原因之一——以获得更多的保证,确保您的软件按预期工作。
我会注入B::foo mock,并检查它是否被调用过一次,并且在给定来自B的模拟结果的情况下,来自A的结果也是预期的。
你需要问问自己这样做能获得多少收益。如果A
是B
的简单包装
- 这样的
A
测试有多大价值 A
代码中的错误检测起来有多难- 制作起来有多容易
- 修复起来有多难
每一次单元测试都是要做出的决定。没有"是的,为这个类编写测试"准则或规则。您需要确定您的时间是否可以花在编写包装类的单元测试上,或者将其投资于其他地方是否更好。
B::foo
是经过单元测试的,因此最好的做法是假设它是完美的。如果你有理由怀疑B::foo
是完美的,那么在BTest
中添加测试,直到你对它感到满意,然后假设它是完美的。
在这一点上,编写A::foo
的单元测试可能是多余的,除非您断言它准确地返回(某种排列)B::foo
。正如jimmy_keen所说,这可能意味着你对A
的测试是微不足道的。请记住,单元测试是为了覆盖可能出现故障的内容而设计的,因此,如果您只有一个包装器,那么您可能不需要进行彻底的测试。
(注意:如果B
不在您的控制之下,并且您无法对其完美性充满信心,请尽一切可能在任何位置添加B
测试——包括一个单独的测试类或ATest
。不过,这是一个单独打破抽象的情况。)