2013-03-18 117 views
1

关于我关于测试抽象类的其他线程(可以找到here),我现在的问题是访问抽象类的私有变量。这与使用Private Accessor有关,但正如我在另一个线程中所陈述的那样,我无法在单元测试的相同文件内创建私有访问器。如何访问抽象类的私有成员

下面是我在谈论私有变量:

public abstract class Component { 

    private eVtCompId mComponentId; //enum 
    private eLayer mLayerId; //enum 
    private IF_SystemMessageHandler mLogger; //interface 

我需要知道如何访问这些,因为我创建一个单元测试,包括让这些特殊变量中的值。

+2

您不应该通过单元测试来测试对象的状态。单元测试的唯一可接受的交互方式是调用方法。 – zerkms 2013-03-18 02:38:55

+3

类的内部实现不应该是单元测试的主题。从理论上讲,这个班级“工作”的方式可以改变,不应该导致单元测试失败,只有班级的公共消费结果/属性应该保持一致。 – Sepster 2013-03-18 02:40:02

+0

现在你打算违反面向对象的原则。如果您确实想访问这些变量,请创建一个受保护的函数或一个返回这些变量值并在派生类中访问它的属性。 – PSL 2013-03-18 02:45:43

回答

1

你需要使用反射

var instance = new Component(); 
... 
var fieldInfo = typeof(Component).GetField("mComponentId", BindingFlags.Instance | BindingFlags.NonPublic); 
var componentId = (eVtCompId)fieldInfo.GetValue(instance); 
1

如果你不介意有点难看,你可以通过做定义,当你在调试模式下进行编译,将只被编译功能:

#if DEBUG 
      ... 
#endif 

然后,您可以定义公有方法,并简单地返回私有变量的值,以使它们仅可用于单元测试。