ewa*_*ewa 24 singleton unit-testing
我已经阅读了使用单例模式的情况.一个常见的案例描述了单身人士单元测试中的困难,但我不清楚为什么会这样呢?如果单元测试是构建的一部分,你不能只引用单例并在需要时使用它吗?(我从java的角度思考,但我想这不重要)
Gre*_*ill 18
关于这一点的一篇很棒的文章是Singletons is Pathological Liars.这使用一个简单的例子描述了为什么使用单例进行测试意外地很难.
如果您引用存在于被测试类之外的单例类,则您不再具有真正的单元测试.而不是测试单个单元 - 目标类 - 您现在正在测试两个单元 - 目标类和单例.
还有一个事实是单身对象往往具有状态.为了使单元测试可重复,当单元测试完成时,需要回滚那些状态更改.或者,您必须创建在运行每个测试后销毁的单例的模拟版本.在源代码和运行时间中都会增加相当大的开销.
TL;DR 在所有测试之间共享同一个对象,这可能会变得很痛苦。
如果单例持有某种状态,并且您对其运行多个测试,那么测试的顺序可能会成为一个问题。想象一个单独的“MailStore”,它包含一个消息列表。我想编写一个用于列出邮件的单元测试,另一个用于删除它们。
当然,如果“列表”在“删除”之前运行,也许没问题。如果“删除”在“列表”之前运行,那么我们会挣扎,因为没有什么可删除的。(结果根据运行测试的顺序而变化。)