或者最好使用另一种设计模式?如何用DUnit测试Singleton类?
回答
几天前回复了类似的问题here, mocking a Singleton。原文是针对C#.Net关于嘲笑单身人士的行为,但仍应适用。
至于单身模式,它本身没有任何问题 - 在许多情况下我们想集中逻辑和数据。但是,单例和静态类之间存在很大差异。将您的单例构建为一个静态类,硬编码将其实现传递给应用程序中的每个消费者 - 这使单元测试变得非常困难!
你想要做的是为你的单例定义一个接口,为你的消费者提供使用方法。反过来,您的消费者通过传递对实现类的引用(通常这是您的应用程序,或者如果您熟悉依赖注入\控制反转,则是容器)。
这是一个框架,无论是谁实例化的消费者,这是负责确保一个和唯一一个实例浮动。从静态类到接口引用真的不是那么大的一个飞跃[如上面的链接所示],你只是失去了一个全局访问实例的便利 - 我知道我知道,全局引用非常诱人,但卢克转身回到黑暗面,你也可以!
一般来说,最佳实践建议避免静态引用,并鼓励对接口进行编程。请记住,仍然可以将这些约束应用于单例模式。按照这些指导原则,你应该没有问题的单元测试你的工作:)
希望这会有所帮助!
单身!=公共静态类,而单==单个实例
I'm using the following pattern当我写,我可以模拟一个基于静态的单身人士。代码是Java,但我认为你会得到一个想法。这种方法的主要问题是,你必须放松构造函数来保护包(这种类型击败了一个真正的单例)。 作为一个方面说明 - 代码适用于嘲笑你的“静态”代码而不一定只是调用它的代码
缺乏可测试性是经典Singleton模型(返回实例的静态类方法)的主要缺点之一。就我而言,这足以证明可以重新设计任何使用Singletons来使用其他设计的代码。
如果你绝对需要一个单一的实例,那么依赖注入和写入接口,正如johnny g所建议的那样,绝对是要走的路。
如果你必须使用一个单身人士(并有理由这样做......但我会尽可能避免它)。我会建议使用IOC容器来管理它。我不知道是否有一个德尔福或不。但是在Java中你可以使用Spring,在.NET中你可以使用Windsor/Castle。一个IOC容器可以容纳Singleton并且可以注册不同的测试实现。
这可能是一个太大的主题进入这个片段以外的地方。
我通常只使用Flyton对象或类似值对象的单身。查看IoC容器(如上所述)可能是处理共享对象比单例更好的方法。
考虑到在Smalltalk(其中很多这些模式的起源),真假都是有效的单身:)
- 1. 如何测试Singleton类?
- 2. 如何测试PHP PDO Singleton类?
- 3. 如何使用DUnit测试私有方法?
- 4. DUNIT测试在MIDAS /的DataSnap项目
- 5. 如何从DUnit测试中获得活动的TGUITestRunner?
- 6. 如何使Delphi DUnit测试在TSQLConnection.Connected = true时失败
- 7. 使用Singleton进行单元测试
- 8. TIdHTTPServer在我的DUnit测试中激活EThread错误6时
- 9. Dunit控制台模式 - 执行测试两次
- 10. 如果类本身正在使用PowerMock进行测试,如何模拟Singleton类的私有方法?
- 11. Java:注入Singleton bean来测试
- 12. Singleton类
- 13. 如何从第一类(APEX类测试/ salesforce测试)中测试第二类func调用的http调用
- 14. 如何编写测试类
- 15. 如何测试容器类?
- 16. 如何将我的测试类转换为JUnit测试用例?
- 17. 如何编写用于OSGi(集成)测试的Arquillian测试类?
- 18. 如何测试在被测试的类中调用的方法?
- 19. 如何在laravel中使用phpunit测试特定测试类
- 20. DUnit:'Global'SetUp and TearDown
- 21. 如何制作一个jUnit4测试用例类Spring测试用例类?
- 22. 如何为类中的所有测试设置测试类别
- 23. 如何测试使用DispatcherTimer的类?
- 24. 单元测试如何使用SmartGWT类?
- 25. ByteBuddy:如何使用java测试类。*
- 26. 如何使用Espresso测试抽象类?
- 27. 如何使用isinstance测试pywintypes.datetime类型?
- 28. 如何测试类和她的子类
- 29. 如何忽略测试类类与ArchUnit
- 30. 如何一次查看所有测试用例在DUnit GUI中的状态消息?
...关于Smalltalk中:是的,但真假是_so_可测试:) – mjn 2011-12-01 13:51:49