![](/img/trans.png)
[英]Cannot mock class with constructor having array parameter using Rhino Mocks
[英]How to Mock a class which has private Constructor using Rhino Mocks
我正在使用Rhino Mocks 3.6
我有一个类“Configuration.cs”,它有一个私有构造函数(我为Singleton实现做了)。 现在我想模仿这个类(Partial Mock),但我无法做到。 错误:
无法实例化类的代理:Efi.CrmIntegration.MonarchServices.Utilities.Configuration。 找不到无参数构造函数。 参数名称:constructorArguments
什么是相同的解决方案。
静态单例很难模拟和测试,理想情况下应该避免。 正如RhinoMocks指出的那样,你不能对你的配置单例进行部分模拟,但你有一些选择。
公开您的私有构造函数。 不过,这应该算是一个快速的黑客行为。 有更好的方法来做到这一点。
更改单例实例化的方式。 给你的Configuration
类一个接口,比如说IConfiguration
。 您可能已在Configuration
上拥有静态Instance
属性。 将其类型更改为IConfiguration
,并为其提供公共设置器。 在单元测试中,模拟或存根IConfiguration
,并将Configuration.Instance
属性设置为该属性。 这仍然是一种破解(但是当你有很多已经在使用单例的类时,它很有用,而你没有时间实现下一个选项)。
使用依赖注入。 给你的Configuration
类一个接口,再说一次IConfiguration
。 应更改依赖于Configuration
单例的类,以在其构造函数中获取IConfiguration
参数。 当您创建其中一个类的实例时,您将注入Configuration
的单例实例。 在测试时,制作IConfiguration
类型的模拟或存根,并将其传递给类。 您可以使用依赖注入框架(例如Castle Windsor或Ninject)来改进这一点,您可以使用它来完全取消对静态单例的需求。
我强烈建议您更改设计并使用选项3(如果可能,使用依赖注入框架)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.