【问题标题】:About mocking frameworks关于模拟框架
【发布时间】:2016-02-12 04:16:40
【问题描述】:
我正在使用powermock,对此我有几个问题。
我们是否需要修改我们的代码,以防我们发现(在稍后阶段)它无法使用powermock 或mockito 或任何其他测试框架进行测试?
即我们是否应该停止编写某些框架无法测试的静态/私有方法(我知道powermock 有能力测试这些方法)
在模拟/监视对象时,是否应该调用实际方法?即我通过在方法调用中保留一个调试点来检查它,执行是否应该转到调试点?
请帮助我理解这些事情。
【问题讨论】:
标签:
java
unit-testing
mocking
powermockito
【解决方案1】:
1.) 不可测试/可测试性差的代码主要是设计不佳的标志,所以是的,您应该更改代码。大量静态方法/状态是一种代码气味,这意味着设计不佳并最终导致更高的维护工作量。
私有方法通常应该在其公共调用者中进行测试,因为它们只是助手。在我看来,永远不应该直接测试私有方法,因为它们可能随时通过重构而改变,因为你的类的公共接口应该是某种稳定的。
2.) 模拟时,不应调用目标方法/对象。而间谍应该调用被间谍的方法/对象
【解决方案2】:
我被带入了一个拥有庞大遗留系统的团队,但他们正在向其中添加新的类/方法。这些类和方法将涉及多达 10 个 DAO/DAL。但是,这些 DAO/DAL 已经启动并运行了 20 多年,并且几乎没有失败。所以他们的行为几乎是意料之中的。在这种情况下使用模拟效果非常好,我可以为新代码编写纯粹的单元测试,并模拟所有 DAO 以返回对象/或异常来检查我们的边界场景。
当您必须访问数据库、通过 Internet 建立连接或有一个特别大的类您不想实例化而只调用一个方法时,Mocks 非常适合。如果您有一个类在其构造函数中需要许多对象(每个对象都需要实例化),但实际上您只需要获取 Class.CanRetry() (将返回 true 或 false),模拟会很好地工作这个实例。
锤子是一个很好的工具,但它不会帮助你疏通马桶......至少很好。模拟是了解如何使用的好工具,但它们有时间和地点。
有关如何/何时使用模拟的更多信息,请参阅这两篇很棒的文章:
When to Mock
Mocks aren't stubs(阅读时间较长,但信息量很大)
关于您的第二个问题,下一篇文章将使您更好地了解所有不同类型的“测试替身”之间的区别,包括模拟对象、测试间谍、虚拟对象等...
Agile Engineering: Test Doubles