如何在C#中调用含受保护构造函数的类以测试其方法?
解决受保护构造函数的类的单元测试问题
针对你遇到的ClassA因受保护构造函数无法实例化、进而无法测试methodofClassA()的问题,给你几个实用的解决办法:
1. 在测试项目中创建派生类
受保护构造函数允许子类访问,所以直接在测试项目里写一个继承自ClassA的子类,通过子类实例化对象后就能调用目标方法。
示例代码:
// 测试项目中定义用于测试的派生类 public class TestableClassA : ClassA { public TestableClassA(double[] numbers) : base(numbers) { } } // 单元测试代码 [Test] public void TestMethodofClassA() { var testInstance = new TestableClassA(new double[] { 1.0, 2.0 }); var result = testInstance.methodofClassA(); // 这里编写你的断言逻辑,验证结果是否符合预期 }
2. 通过反射直接实例化
如果不想额外定义派生类,也可以用反射获取受保护的构造函数,直接创建实例。这种方式不需要修改原代码。
示例代码:
[Test] public void TestMethodofClassA_WithReflection() { // 获取ClassA中参数为double[]的受保护构造函数 var constructor = typeof(ClassA).GetConstructor( BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(double[]) }, null); // 调用构造函数创建实例 var instance = (ClassA)constructor.Invoke(new object[] { new double[] { 1.0, 2.0 } }); var result = instance.methodofClassA(); // 断言逻辑 }
3. 修改原类添加测试专用构造函数(若有权限修改原代码)
如果你能改动原项目代码,可以给ClassA新增一个内部构造函数,再通过InternalsVisibleTo特性让测试项目访问内部成员,这样测试时就能直接实例化。
修改原类:
public class ClassA { protected ClassA(double[] number) { } // 测试专用的内部构造函数 internal ClassA(double[] number, bool isTestInstance) : this(number) { } public double methodofClassA() { // 原方法实现 return 0; } }
在原项目的AssemblyInfo.cs中添加特性,允许测试项目访问内部成员:
[assembly: InternalsVisibleTo("你的测试项目名称")]
测试代码:
[Test] public void TestMethodofClassA_WithInternalCtor() { var instance = new ClassA(new double[] { 1.0, 2.0 }, isTestInstance: true); var result = instance.methodofClassA(); // 断言逻辑 }
内容的提问来源于stack exchange,提问作者Ann
相关产品推荐
相关产品推荐

