如何使用Rhino Mocks模拟具有私有构造函数的类
本文关键字:构造函数 何使用 Rhino Mocks 模拟 | 更新日期: 2023-09-27 18:19:52
我正在使用Rhino Mocks 3.6
我有一个类"Configuration.cs",它有一个私有构造函数(我是为Singleton实现而做的)。现在我想模拟这个类(Partial mock),但我做不到。错误:
无法实例化类的代理:Efi.CrmIntegration.MonarchServices.Utilities.Configuration。找不到无参数构造函数。参数名称:constructorArguments
同样的解决方案是什么。
静态单态很难模拟和测试,理想情况下应该避免。正如RhinoMocks所指出的,您不能对配置单例进行部分模拟,但您有一些选择。
-
将您的私有构造函数公开。不过,这应该被认为是一个快速破解。有更好的方法可以做到这一点。
-
更改实例化单例的方式。给
Configuration
类一个接口,比如说IConfiguration
。您可能已经在Configuration
上有了一个静态Instance
属性。将其类型更改为IConfiguration
,并为其提供一个公共setter。在单元测试中,mock或stubIConfiguration
,并将Configuration.Instance
属性设置为该属性。这仍然是一种破解(但当你有很多已经在使用singleton的类,而你没有时间实现下一个选项时,这是很有用的)。 -
使用依赖项注入。给你的
Configuration
类一个接口,让我们再次说IConfiguration
。对Configuration
单例有依赖关系的类应该更改为在其构造函数中使用IConfiguration
参数。当您创建其中一个类的实例时,您将注入Configuration
的singleton实例。测试时,制作一个类型为IConfiguration
的mock或stub,并将其传递给类。您可以使用依赖注入框架对此进行改进,如Castle Windsor或Ninject,您可能可以使用它来完全消除对静态单例的需求。
我强烈建议您更改设计并使用选项3(如果可能的话,使用依赖注入框架)。