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

时间:2013-06-26 10:23:39

标签: c# rhino-mocks rhino-mocks-3.5

我正在使用Rhino Mocks 3.6

我有一个“Configuration.cs”类,它有一个私有构造函数(我为Singleton实现做了)。 现在我想模仿这个类(Partial Mock),但我无法做到。 错误:

无法实例化类的代理:Efi.CrmIntegration.MonarchServices.Utilities.Configuration。 找不到无参数构造函数。 参数名称:constructorArguments

同样的解决方案。

1 个答案:

答案 0 :(得分:3)

静态单例难以模拟和测试,理想情况下应该避免。正如RhinoMocks指出的那样,你无法对你的配置单例进行部分模拟,但你有一些选择。

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

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

  3. 使用依赖注入。为Configuration课程提供一个界面,再说一遍IConfiguration。应更改依赖于Configuration单例的类,以在其构造函数中使用IConfiguration参数。当您创建其中一个类的实例时,请注入Configuration的单例实例。在测试时,创建一个IConfiguration类型的模拟或存根,然后将其传递给类。您可以使用依赖注入框架(例如Castle Windsor或Ninject)对此进行改进,您可以使用它来完全取消对静态单例的需求。

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