如何测试无默认构造函数类中重写的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
相关产品推荐
相关产品推荐

