You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:36:14