为什么难以对依赖于单身的系统进行单元测试?

ewa*_*ewa 24 singleton unit-testing

我已经阅读了使用单例模式的情况.一个常见的案例描述了单身人士单元测试中的困难,但我不清楚为什么会这样呢?如果单元测试是构建的一部分,你不能只引用单例并在需要时使用它吗?(我从java的角度思考,但我想这不重要)

Gre*_*ill 18

关于这一点的一篇很棒的文章是Singletons is Pathological Liars.这使用一个简单的例子描述了为什么使用单例进行测试意外地很难.

  • 链接坏了. (4认同)
  • 在这里工作正常. (3认同)

qua*_*cle 6

如果您引用存在于被测试类之外的单例类,则您不再具有真正的单元测试.而不是测试单个单元 - 目标类 - 您现在正在测试两个单元 - 目标类单例.

还有一个事实是单身对象往往具有状态.为了使单元测试可重复,当单元测试完成时,需要回滚那些状态更改.或者,您必须创建在运行每个测试后销毁的单例的模拟版本.在源代码和运行时间中都会增加相当大的开销.


The*_*son 6

TL;DR 在所有测试之间共享同一个对象,这可能会变得很痛苦。

如果单例持有某种状态,并且您对其运行多个测试,那么测试的顺序可能会成为一个问题。想象一个单独的“MailStore”,它包含一个消息列表。我想编写一个用于列出邮件的单元测试,另一个用于删除它们。

当然,如果“列表”在“删除”之前运行,也许没问题。如果“删除”在“列表”之前运行,那么我们会挣扎,因为没有什么可删除的。(结果根据运行测试的顺序而变化。)