5

当你使用组合时,你可以模拟你的被测类所依赖的其他对象,但是当你使用继承时,你不能模拟基类。(或者你可以吗?)

我通常更喜欢组合而不是继承,但有时继承似乎真的是这项工作的最佳工具——嗯,至少在涉及单元测试之前是这样。

那么,如何测试继承?还是您只是将其视为不可测试而将其丢弃并改用组合?

注意:我主要使用 PHP 和 PHPUnit,因此非常感谢这方面的帮助。但是知道其他语言是否有解决这个问题的方法也很有趣。

4

5 回答 5

5

使用一套反映类层次结构的单元测试。如果您有一个基类 Base 和一个派生类 Derived,那么就有测试类 BaseTests 并从该 DerivedTests 派生。BaseTests 负责测试 Base 中定义的所有内容。DerivedTests 继承了这些测试,还负责测试 Derived 中的所有内容。

如果您想在 Base 中测试受保护的虚拟方法(即 Base 与其后代类之间的接口),那么创建一个测试该接口的仅测试派生类也可能有意义。

于 2008-09-22T17:45:40.213 回答
4

只要您不覆盖父类的公共方法,我不明白为什么需要在它的所有子类上测试它们。单元测试父类上的方法,只测试子类上的新方法或覆盖的方法。

于 2008-09-19T09:48:04.577 回答
3

您在合成中使用模拟对象的原因是,如果真实对象做了您不想设置的事情(例如使用套接字、串行端口、获取用户输入、检索大容量数据等)。您应该尽可能使用真实的对象。模拟对象仅适用于使用真实对象实现和维护测试的估计工作量大于使用模拟对象实现和维护测试的估计工作量。你的基类不应该做任何花哨的事情!

所以你不必测试继承。假设您正在使用基类的行为,因此只需像往常一样测试派生类 - 根据测试的需要调用基类和派生类的方法。这可确保测试派生类的所有预期行为。

本质上,(大多数时候)您测试派生类,就好像基类是不可见的一样。

于 2008-09-19T10:08:38.363 回答
1

为什么要模拟基类?

如何从不存在的父类创建派生类?

像往常一样测试它,但是有父类。

我想你还没有讲完整个故事。

此外,语言功能应该可以工作(除非您使用的是 beta 版本左右),因此您不需要测试该方法是否实际存在于派生类中。

于 2008-09-19T09:49:22.823 回答
0

不,你没有。你只需要检查被覆盖的方法是否做了它们应该做的事情。它绝不应该影响您的父方法的行为。如果您的父方法开始失败,则意味着您在父级别测试它们时错过了绑定条件。

于 2008-09-19T12:02:44.757 回答