伪造被测对象的方法

Kei*_*son 6 testing unit-testing mocking

有没有理由为什么你不应该为了测试另一种方法而在你正在测试它的对象上创建一个对象的部分伪造或假冒一个方法?这可能有助于您避免制作一个全新的模拟对象,或者当您伪造的方法中存在外部依赖关系时,您无法合理地摆脱它并且想要避开所有其他单元测试?

Kei*_*son 1

Roy Osherove 的《单元测试的艺术》第 3 章中描述的提取和覆盖技术似乎确实是一种伪造部分被测类的方法(第 71-77 页)。奥谢罗夫没有解决这个问题的其他一些答案中提出的担忧。

此外,Michael Feathers 在有效处理遗留代码中对此进行了讨论。他将生成的类称为测试子类(227) 以及技术子类和覆盖方法(401)。现在,当然,Feathers 并没有对新代码中推荐的原始技术进行阐述。但他仍然认真对待它,将其视为一种潜在有用的技术。

我也问过我以前的计算机教授这个问题。他博览群书,目前在软件行业全职工作,并在该行业发展迅速。他说这种技术肯定有很好的应用前景,他公司的代码库中有几十个类正在以这种方式进行测试。他说,就像任何技术一样,它可能会被过度使用。

我最初写这个问题时,我还是单元测试的新手,对依赖注入几乎一无所知。现在,在对两者都有一些经验之后,我想补充一点,使用这种测试技术的必要性可能是一种气味。这可能是一个迹象,需要重新设计你的依赖方法。如果需要伪造的方法是从基类继承的方法,则可能意味着您需要更认真地对待“优先组合而不是继承”这句格言。您应该注入依赖项而不是继承它们。