单元测试访问私有变量利器——反射

在写单元测试的时候,有时候我们想修改或者访问某个对象或类的私有变量,这时候我们可以利用C#提供的反射机制实现这一目的。

  1. 调用对象的GetType()方法获取对应的Type对象
  2. 然后调用type对象的GetField方法获取对应的字段,这里我们使用
    public abstract FieldInfo GetField(
    string name,
    BindingFlags bindingAttr
    )

    来获取对应的字段

    1. 第一个参数我们传入字段名
    2. 第二个参数我们传入绑定标识
      • 如果我们需要获取私有静态变量,我们就传入
        BindingFlags.Static | BindingFlags.NonPublic
      • 如果我们需要获取私有非静态变量,我们就传入
        BindingFlags.Instance | BindingFlags.NonPublic
      • 更多的绑定标识请参考这里
  3. 获取到FieldInfo之后,我们可以调用FieldInfo的SetValue方法来设置字段的值,这里我们使用如下方法
    public void SetValue(
    	Object obj,
    	Object value
    )

    其中

    • 第一个参数需要设置的对象,如果是一个静态变量,第一个参数设置为null即可
    • 第二个参数为需要设置的字段值

    例如

    FieldInfo field = Log.Get().GetType().GetField("thisInstance", BindingFlags.Static | BindingFlags.NonPublic);
     field.SetValue(null, null);

当然利用发射你也可以访问被隐藏的私有方法。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>