我试图为抽象类编写单元测试。更具体地说,我有一个像
这样的课程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
课程考虑到我无法创建它的实例。
答案 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...
}
}
这使您可以调用例程,使您可以访问受保护的方法和字段,并且因为您在单元测试中声明了测试类,所以不会影响其他代码。这种方法甚至可以捕获抽象基类更改而不更新测试代码的一些情况。