【发布时间】:2013-12-10 20:19:20
【问题描述】:
我正在尝试编写一个单元测试来测试抽象类中的受保护方法。我尝试编写一个继承自抽象类的测试类,但是当我实例化测试类时,基本抽象类尝试连接到 Oracle 数据库并失败,这不允许我测试我感兴趣的受保护方法in. 抽象类不能修改。
如何直接对这个抽象类中的受保护方法进行单元测试?
这是我尝试使用反射的 sn-p。
Type type = typeof(AbstractClass);
BindingFlags eFlags = BindingFlags.Instance | BindingFlags.NonPublic;
MethodInfo myMethod = type.GetMethod("ProtectedMethod", eFlags);
object[] arguments = new object[] { _myDs };
myMethod.Invoke(type, arguments);
_myDs = (DataSet)arguments[0];
【问题讨论】:
-
在可以创建子类的情况下为什么还要使用反射?如果您的基本方法连接到数据库,那么您必须模拟它。您可以将数据库连接到不同的类吗?
-
我已经提到,当我使用抽象类的派生类时,当派生类实例化时,抽象类会尝试访问Oracle数据库并失败,从而导致整个单元测试失败.那么......我怎样才能获得抽象类内部的受保护方法?不,我无法将数据库连接提取到不同的类。它遵循 CSLA 标准。
-
@Shar1er80:如果您遇到这样的问题,那么该方法是否真的属于该类?如果您想在没有连接的情况下对其进行测试,则意味着它有单独的责任。考虑将其移至其他班级。
-
基类在实例化时访问数据库是没有意义的,如果你不能改变它访问数据库的方式,那么这个类就太紧耦合了。
标签: c# .net reflection nunit abstract-class