如何使用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

同样的解决方案是什么。

如何使用Rhino Mocks模拟具有私有构造函数的类

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

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

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

  3. 使用依赖项注入。给你的Configuration类一个接口,让我们再次说IConfiguration。对Configuration单例有依赖关系的类应该更改为在其构造函数中使用IConfiguration参数。当您创建其中一个类的实例时,您将注入Configuration的singleton实例。测试时,制作一个类型为IConfiguration的mock或stub,并将其传递给类。您可以使用依赖注入框架对此进行改进,如Castle Windsor或Ninject,您可能可以使用它来完全消除对静态单例的需求。

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