无法为创建模拟
public MetricsProvider(IConfig configData, IMetricsLogger log)
{
config = configData;
logger = log;
oracleDAL = new OracleDataAccess(config, logger);
MetricsData = new DataCollector();
}
我所做的步骤:为IConfig
和IMetricsLogger
创建一个mock对象。我试图调用MetricsProvider
(config,logger),但它引用了Oracle连接,无法获得连接或模拟连接对象。
这实际上是一个完美的例子,说明了为什么依赖注入是有益的。
您想要的是测试MetricsProvider
。但是因为MetricsProvider
在内部创建了OracleDataAccess
和DataCollector
的实例,所以如果不测试这些类,就无法测试MetricsProvider
。
但是这些课程依赖于什么呢?它们是否需要额外的依赖项,比如app.config设置,如果不查看这些类的源代码,就无法查看这些设置?(如果这些类依赖于其他依赖性更强的类,该怎么办?)
如果测试失败,很难判断缺陷是在MetricsProvider
中,还是隐藏在其他类中的未知依赖项。
修复它的方法是将一个接口传递给由OracleDataAccess
实现的构造函数。如果该类尚未实现接口,则可以创建一个与现有类相对应的新接口。或者,如果只需要一个方法,可以定义一个更具体的接口,并将OracleDataAccess
封装在实现该接口的类中。
然后MetricsProvider
将依赖于注入到构造函数中的接口,您将能够对其进行模拟。由于该mock将使您能够准确地确定IOracleDataAccess
的行为,现在您将能够单独测试MetricsProvider
。