2008-09-19 81 views
5

当你使用合成时,你可以模拟你的类所依赖的其他对象 ,但是当你使用 继承时,你不能模拟基类。 (?或CAN你)如何进行单元测试继承对象?

我一般都尽量prefer composition over inheritance, 但有时确实继承好像这个职位的最佳工具 - 好吧,至少直到它的单元测试。

那么,你如何测试继承?或者你只是把它作为 不可测,并使用组合来代替?

说明:我大部分都使用PHP和PHPUnit,所以对这方面的帮助是最赞赏的 。但是如果在其他语言中有解决这个问题的方法,知道 也会很有趣。

+0

有一个[很好的例子](http://stackoverflow.com/questions/58969/best-way-to-unit-test-a-website-with-multiple-user-types-with-phpunit#63442 )为[由华丽给出的解决方案](http://stackoverflow.com/questions/100795/how-do-i-unit-test-inheriting-objects#116340)。让测试层次结构与您的类层次结构相似。 – GrGr 2008-11-03 09:23:38

+0

我不明白如何嘲笑一个超类。这将是一个语言功能ihmo。你究竟想要测试什么?对我来说,这听起来像反射可能对你有帮助? – Robse 2008-09-19 09:49:25

回答

4

只要你不重写父类的公共方法,我不明白为什么你需要测试它的所有子类。单元测试父类的方法,并且只测试子类中的新方法或被覆盖的方法。

1

你为什么要嘲笑基类?

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

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

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

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

3

你在构图中使用模拟对象的原因是,如果真实的对象做你不想设置的东西(如使用套接字,串行端口,获取用户输入,检索庞大的数据等)。您应该尽可能使用真实的物体。模拟对象仅适用于使用实际对象实施和维护测试的预计工作量大于使用模拟对象实现和维护测试的工作量时。你的基础课不应该做任何事情!

所以你不必测试继承。假设您正在使用基类的行为,那么就像通常一样测试派生类 - 根据测试适当调用基类和派生类的方法。这确保了派生类的所有预期行为都经过测试。

基本上(大多数情况下)您测试派生类,就好像基类不可见一样。

0

不,你不知道。你只需要检查重写方法做他们应该做的。它应该不会影响你的父方法的行为。如果父方法开始失败,那么这意味着您在父级测试时错过了约束条件。

5

使用一套镜像类层次结构的单元测试。如果您有基类Base和派生类Derived,则可以使用测试类BaseTests并从该DerivedTests派生。 BaseTests负责测试Base中定义的所有内容。 DerivedTests继承这些测试,并负责测试Derived中的所有内容。

如果要测试Base中受保护的虚拟方法(即Base和它的派生类之间的接口),那么对于测试该接口的仅测试派生类也是有意义的。