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

如何测试无默认构造函数类中重写的Protected方法?

解决子类构造函数参数问题的方案

因为IdentifierManager只提供了带参数的构造函数,继承它的IdentifierManager_Exposed必须显式定义构造函数,并调用父类构造函数传递依赖参数,具体实现如下:

1. 为子类添加匹配的构造函数

修改IdentifierManager_Exposed类,添加与父类一致的构造函数,通过base关键字将参数传递给父类构造逻辑:

public class IdentifierManager_Exposed: IdentifierManager
{
    // 显式声明构造函数,接收父类所需的依赖参数
    public IdentifierManager_Exposed(ILogger<IdentifierManager> logger, IMemoryCache cache)
        : base(logger, cache) // 调用父类的构造函数初始化依赖
    {
    }

    public string DoSomething()
    {
        return base.DoSomething();
    }
}

2. 单元测试中模拟依赖对象

在单元测试代码里,使用模拟框架(比如Moq)创建ILogger<IdentifierManager>和IMemoryCache的实例,再传入子类构造函数完成初始化:

// 用Moq模拟两个依赖对象
var loggerMock = new Mock<ILogger<IdentifierManager>>();
var cacheMock = new Mock<IMemoryCache>();

// 实例化暴露了目标方法的子类
var exposedManager = new IdentifierManager_Exposed(loggerMock.Object, cacheMock.Object);

// 调用暴露的方法并验证结果
var result = exposedManager.DoSomething();
Assert.AreEqual("This is the method I want to test...", result);

补充:无需子类的替代测试思路

如果不想创建子类,也可以通过反射直接调用protected方法:

var loggerMock = new Mock<ILogger<IdentifierManager>>();
var cacheMock = new Mock<IMemoryCache>();
var manager = new IdentifierManager(loggerMock.Object, cacheMock.Object);

// 通过反射获取protected的DoSomething方法
var method = typeof(IdentifierManager).GetMethod("DoSomething", BindingFlags.Instance | BindingFlags.NonPublic);
var result = method.Invoke(manager, null) as string;

// 断言结果正确性
Assert.AreEqual("This is the method I want to test...", result);

内容的提问来源于stack exchange,提问作者LonelySemiColon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:12:13