1

我正在使用 Rhino Mocks 3.6

我有一个类“Configuration.cs”,它有一个私有构造函数(我是为单例实现做的)。现在我想模拟这个类(部分模拟),但我做不到。错误:

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

相同的解决方案是什么。

4

1 回答 1

3

静态单例很难模拟和测试,理想情况下应该避免。正如 RhinoMocks 所指出的,您不能对配置单例进行部分模拟,但您有一些选择。

  1. 将您的私有构造函数公开。不过,这应该被认为是一种快速破解。有很多更好的方法可以做到这一点。

  2. 更改单例的实例化方式。给你的Configuration类一个接口,比方说IConfiguration。您可能已经InstanceConfiguration. 将它的类型更改为IConfiguration,并给它一个公共设置器。在您的单元测试中, mock 或 stub IConfiguration,并将Configuration.Instance属性设置为那个。这仍然是一种 hack(但是当您有很多已经在使用单例的类并且您没有时间实现下一个选项时,它很有用)。

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

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

于 2013-06-26T16:32:10.853 回答