【发布时间】:2015-04-19 04:58:31
【问题描述】:
我有以下场景:
我想模拟一个界面,以便对我的应用进行单元测试。我试图不创建一个新的模拟类来实现我的接口,而是创建一个继承原始具体类的新类,并在调用该方法时使用 new 关键字强制执行新行为。但由于某种原因,调用的是具体类的方法,而不是我创建的类(作为模拟)
以下代码:
public interface IMyService
{
Model GetModelData(int id)
}
public class MyService : IMyService
{
public Model GetModelData(int id)
{
//call to db
}
}
public class MyService2 : MyService
{
public MyService2()
: base(new MyRepository())
{
}
public new Model GetModelData(int id)
{
return new Model();
}
}
注入依赖:
x.ForRequestedType<IMyService>().TheDefaultIsConcreteType<MyService2>();
检索具体类:在调试时我可以看到 myService 指向 MyService2 类,但该方法在 MyService 类上执行。
_myServie = ObjectFactory.GetInstance<IMyService>();
Model modelData = _myServie.GetModelData(5);
【问题讨论】:
-
你使用的是哪个依赖注入框架?
-
@dav_i:通过查看代码,我假设是 StructureMap。
ObjectFactory是 StructureMap 所拥有的。 -
@Avais,请解释为什么您要创建一个派生自真实实现的模拟,而不是仅基于接口创建一个模拟。您所做的事情很脆弱,并使测试变得更加复杂。如果您需要包含实现,那么您的设计肯定有问题。
-
是的,是结构图。 @Steven:那是因为,我不希望我的 MyService2 类实现接口 MyInterface1 上的所有方法(因为它很大)我只想模拟一种我将用于我的更改的方法(不调用存储库)
-
@Avais:你不能改变那个界面并不重要。重要的是您的应用程序代码直接依赖于它自己没有定义的接口。这是一个错误,因为根据APP&P“客户 [...] 拥有抽象接口”。因此,您应该做的是为您的应用程序制作特定的小接口,并且实现(代理)可以将调用转发到丑陋的公司范围的接口定义。不要用这种废话污染你的应用程序代码和测试代码。
标签: c# oop inheritance dependency-injection