2017-01-27 5 views
0

Я пытаюсь написать единичный тест для абстрактного класса. Более конкретно, у меня есть класс, какКак вызвать защищенный метод абстрактного метода с помощью Reflection?

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

и я хочу вызвать MyProtectedVoid с параметрами, а затем проверить, что _myPrivateVariable был установлен на конкретное значение.

Я знаю, как вызвать private метод экземпляра класса с использованием GetMethod как в How do I use reflection to invoke a private method?, но я не знаю, как сделать этот тип вещи с abstract класса, учитывая, что я не могу создать экземпляр из этого.

+0

Вы пытались насмехаться над ним с RhinoMocks? Пример: http://stackoverflow.com/questions/6960459/rhino-mock-an-abstract-class-w-o-mocking-its-virtual-method – MistyK

+0

Вы не должны проверять частную переменную в UT. Проверьте http://stackoverflow.com/questions/1093020/unit-testing-and-checking-private-variable-value и многие другие. – qxg

ответ

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*/); 
    } 
    } 
0

Вы не можете вызвать метод объекта, который не существует, и абстрактные классы сами по себе не могут быть созданы.

Но вы на самом деле пытаетесь решить довольно простую проблему. Поскольку вы просто хотите протестировать методы абстрактного класса, вы можете создать тестовый класс, который наследует от абстрактного класса и «реализует» любые абстрактные методы, не пройдя тест. Затем вы можете использовать тестовый класс для тестирования абстрактного класса и его защищенных методов и полей.

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

Это позволяет вызывать подпрограммы, вы получает доступ к защищенным методам и полям, и потому, что вы объявляете класс теста в модульных тестах вы не влияете на другие коды. Этот подход даже поймает некоторые случаи, когда абстрактный базовый класс изменяется без обновления тестового кода.