我有一个具有依赖关系A
的课程B
。
我给B::foo(String s1, String s2)
写了一个UT。假设我测试了B::foo("a", "a")
假设A::foo(..)
来电B::foo(..)
我是否必须编写A::("a", "a")
的UT?
我会注入B :: foo mock并检查它是否被调用过一次,并且A的结果是预期的,因为来自B的模拟结果。
你会在这种情况下避免嘲笑吗?
您是否已经在B
UT?
答案 0 :(得分:0)
单元测试可作为抵御软件错误的额外防线。在生产代码中制作错误很可能,在生产代码和单元测试中产生相同的错误的可能性要小得多。这是您编写单元测试的原因之一 - 再一次保证您的软件按预期工作。
我会注入B :: foo mock并检查它是否被调用过一次,并且A的结果是预期的,因为来自B的模拟结果。
你需要问问自己这样做有多少。如果A
是简单包装B
A
测试的价值有多大?A
代码中的错误有多难被发现?每个单元测试都是一个决定。没有“是的,为此类编写测试”指南或规则。您需要确定是否可以花时间为包装类编写单元测试,或者将其投入其他地方是否更好。
答案 1 :(得分:0)
B::foo
已经过单元测试,因此最好的做法是假设它是完美的。如果您有理由怀疑B::foo
是否完美,请在BTest
中添加测试,直到您对它感到满意为止,然后假设它是完美的。
此时,编写A::foo
的单元测试可能是多余的,除非你断言它准确地返回(某些排列)B::foo
。如jimmy_keen said,这可能意味着您对A
的测试是微不足道的。请记住,单元测试旨在涵盖可能会破坏的内容,因此如果您拥有的是包装器,则可能不需要进行全面测试。
(警告:如果B
不在您的控制范围内,并且您无法对其完美性充满信心,请尽可能在任何地方添加B
测试 - 包括单独的测试类,或者在ATest
中。这是一个单独的抽象破坏案例。)