繁体   English   中英

如何使用Rhino Mocks模拟一个具有私有Constructor的类

[英]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指出的那样,你不能对你的配置单例进行部分模拟,但你有一些选择。

  1. 公开您的私有构造函数。 不过,这应该算是一个快速的黑客行为。 有更好的方法来做到这一点。

  2. 更改单例实例化的方式。 给你的Configuration类一个接口,比如说IConfiguration 您可能已在Configuration上拥有静态Instance属性。 将其类型更改为IConfiguration ,并为其提供公共设置器。 在单元测试中,模拟或存根IConfiguration ,并将Configuration.Instance属性设置为该属性。 这仍然是一种破解(但是当你有很多已经在使用单例的类时,它很有用,而你没有时间实现下一个选项)。

  3. 使用依赖注入。 给你的Configuration类一个接口,再说一次IConfiguration 应更改依赖于Configuration单例的类,以在其构造函数中获取IConfiguration参数。 当您创建其中一个类的实例时,您将注入Configuration的单例实例。 在测试时,制作IConfiguration类型的模拟或存根,并将其传递给类。 您可以使用依赖注入框架(例如Castle Windsor或Ninject)来改进这一点,您可以使用它来完全取消对静态单例的需求。

我强烈建议您更改设计并使用选项3(如果可能,使用依赖注入框架)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM