如何通过Reflection调用抽象方法的受保护方法?

时间:2017-01-27 22:13:49

标签: c# .net unit-testing oop reflection

我试图为抽象类编写单元测试。更具体地说,我有一个像

这样的课程
str = str.replace(find, replace);

我希望使用参数调用public abstract class MyAbstractClass { // ... private Something _myPrivateVariable; // ... protected void MyProtectedMethod(string[] names) { // ... } // ... } ,然后验证MyProtectedVoid是否已设置为特定值。

我知道如何使用How do I use reflection to invoke a private method?中的_myPrivateVariable来调用类实例的private方法,但我不知道如何做这类事情GetMethod课程考虑到我无法创建它的实例。

2 个答案:

答案 0 :(得分:0)

假设Caller是试图从抽象类调用受保护方法的类。在这种情况下,您将不得不继承抽象类,因为它不允许您创建它的新实例:

public abstract class MyAbstractClass
  {
    // ... 
    private Something _myPrivateVariable; 
    // ...
    protected void MyProtectedMethod(string[] names) { // ... }
    // ... 
  }

public class Caller:MyAbstractClass // inheriting the abstract class
 {
     public void GetAbstractMethod(){
     MyProtectedMethod(/*string[] values*/);
     } 
  }

答案 1 :(得分:0)

您无法调用不存在的对象的方法,也无法创建抽象类。

但你实际上是在尝试解决一个相当简单的问题。因为您只想测试抽象类的方法,所以您可以创建一个继承自抽象类的测试类,并且"实现"通过测试失败的任何抽象方法。然后,您可以使用测试类来测试抽象类及其受保护的方法和字段。

public class MyAbstractTestClass : MyAbstractClass
{
    public void TestProtectedMethod(string[] names)
    {
        Assert...
        this.MyProtectedMethod(names);
        Assert...
    }
}

这使您可以调用例程,使您可以访问受保护的方法和字段,并且因为您在单元测试中声明了测试类,所以不会影响其他代码。这种方法甚至可以捕获抽象基类更改而不更新测试代码的一些情况。