使用合成时,可以模拟其他对象 您的测试等级取决于您,但在您使用时 继承,你不能模拟基类。 (或者你可以吗?)
我通常会尝试prefer composition over inheritance, 但有时继承似乎是最好的工具 对于这项工作 - 至少在单元测试之前。
那么,你如何测试继承?或者你只是把它丢弃了 不可测试而是使用构图?
注意:我主要使用PHP和PHPUnit,所以请帮忙 非常感谢。但知道它也会很有趣 如果有其他语言的解决方案。
答案 0 :(得分:5)
使用一组镜像类层次结构的单元测试。如果您有基类Base和派生类Derived,那么拥有测试类BaseTests并从DerivedTests派生。 BaseTests负责测试Base中定义的所有内容。 DerivedTests继承了这些测试,并且还负责测试Derived中的所有内容。
如果要在Base中测试受保护的虚拟方法(即Base及其后代类之间的接口),那么创建一个测试该接口的仅测试派生类也是有意义的。
答案 1 :(得分:4)
只要你不覆盖父类的公共方法,我就不明白为什么你需要在它的所有子类上测试它们。单元测试父类的方法,并仅测试子类上的新方法或重写方法。
答案 2 :(得分:3)
在合成中使用模拟对象的原因是,如果真实对象执行了您不想设置的操作(例如使用套接字,串行端口,获取用户输入,检索大量数据等)。您应该尽可能使用真实对象。模拟对象仅适用于使用真实对象实现和维护测试的估计工作量大于使用模拟对象实现和维护测试的工作量。你的基类不应该做那样的事情!
所以你不必测试继承。据推测,您正在使用基类的行为,因此只需像通常那样测试派生类 - 在基础类和派生类上调用适合测试的方法。这可以确保测试派生类的所有预期行为。
基本上,(大多数情况下)您测试派生类,就好像基类是不可见的一样。
答案 3 :(得分:1)
为什么要模拟基类?
如何从不存在的父类创建派生类?
像往常一样测试它,但是有父类。
我想你还没有讲完整个故事。
此外,语言功能应该可行(除非您正在使用beta版本),因此您无需测试该方法是否实际存在于派生类中。
答案 4 :(得分:0)
不,你没有。您只需检查重写方法是否执行了应有的操作。它应该不会影响父方法的行为。如果您的父方法开始失败,那么这意味着您在父级别测试时错过了绑定条件。