jmock作者撰写的有关模拟框架的优秀论文 。 本文写于18年前的2004年,但其中有许多构建可维护软件系统的技巧。
![](https://i-blog.csdnimg.cn/blog_migrate/138b24d0c801f42cdf1781914a0a5a4e.png)
在这篇文章中,我将重点介绍本文中的关键思想,但建议您阅读本文,以获取有关模拟和编程实践的重要思想。
模拟对象是测试驱动开发的扩展。
当我们开始考虑首先编写测试时,模拟对象可能会很有用,因为这可以模拟仍未开发的零件。 认为是构建原型系统的更好方法。
模拟对象作为一种将测试与第三方库隔离的技术不太有趣。
这是关于模拟的常见误解,我已经使用模拟看到/编写了许多代码。 这确实是来自模拟框架作者的大开眼界的事实。
写作测试是设计活动
确实如此,但是作为工程师,我们花了很多时间放弃编写测试的最佳部分。 由测试驱动的设计还提供了有关实际问题的见解,并导致了
发明,因为开发人员必须认真考虑问题并避免过度设计
耦合与内聚
当我们开始接线测试时,它为我们做出的耦合和内聚决策提供了很好的思路。 好的软件将具有低耦合和高凝聚力。 这也导致任务的功能分解。
井设计系统的另一个好处是它没有Law_of_Demeter ,这是不经意间引入系统的常见问题之一。 许多微服务都遭受这种反模式的困扰。
需要驱动的发展
由于模拟需要显式的代码/设置,因此它来自测试用例的需求/需求。 您不必根据预测会在6个月后需要某些功能进行编码,因此可以专注于客户需求。 测试结果产生的所有接口都狭窄且适合目的。 这种类型的开发也称为自顶向下开发。
纸报价
“”” 我们发现,需求驱动的开发有助于我们专注于手头的需求并开发一致的对象。 “””
按组成编程
测试优先方法允许您考虑组件的可组合性,每件事都作为构造函数参数或方法参数传递。
一旦使用这样的设计原理构建系统,就很容易测试/更换系统的一部分。 模拟对象允许考虑可组合性,以便模拟系统的某些部分。
模拟测试变得太复杂
论文中的一项观察谈到了模拟测试的复杂性。 如果系统设计薄弱,那么模拟将变得困难而复杂。 它确实放大了问题,例如耦合,关注点分离。 我认为这是最好的使用模拟对象来获取设计反馈并像激励器一样使用它来使系统变得更好的方法。
不要在模拟中添加行为
根据论文,我们绝不应在存根中添加行为,以防万一您有被诱惑这样做的可能,这表明责任错位了。
如果您喜欢该职位,那么您可以在Twitter上关注我,以获取有关我撰写的随机内容的通知。
翻译自: https://www.javacodegeeks.com/2019/08/need-driven-software-development-using-mocks.html