单元测试:测试调用工厂类的私有方法时遇空引用异常如何解决?
解决单元测试中的NullReferenceException问题
你遇到的NullReferenceException核心原因是测试代码的Mock配置错误:FingerprintCalculatorFactoryMock.Setup(...).Returns(It.IsAny<IFingerprintCalculator>())这行写法有误——It.IsAny<T>是用于匹配方法参数的语法,不能用来返回实例,它实际会返回null,导致业务代码中calculator变量为空,调用Compute方法时触发空引用异常。
正确的测试实现步骤及代码
- 创建
IFingerprintCalculator的Mock实例,并为其Compute方法配置预期返回值 - 让工厂Mock的
Create方法返回这个已配置好的计算器Mock实例 - 修正测试方法的规范(比如NUnit中测试方法应为
void,同步方法无需await) - 添加验证逻辑,确保依赖方法按预期被调用
修改后的测试代码示例:
private class TestContext { public readonly Mock<IFingerprintCalculatorFactory> FingerprintCalculatorFactoryMock = new(); public readonly Mock<IFingerprintCalculator> FingerprintCalculatorMock = new(); } [Test] public void Test_AnyFunction() { // 定义测试用的预期值 const string inputParam = "xxxx"; const string mockComputeResult = "mock-fingerprint"; const string expectedFinalResult = mockComputeResult + "YYY"; // 配置Mock行为 var testContext = new TestContext(); // 配置计算器的Compute方法,传入指定参数时返回预期值 testContext.FingerprintCalculatorMock .Setup(calculator => calculator.Compute(inputParam)) .Returns(mockComputeResult); // 配置工厂创建方法,返回上述Mock计算器实例 testContext.FingerprintCalculatorFactoryMock .Setup(factory => factory.Create()) .Returns(testContext.FingerprintCalculatorMock.Object); // 执行被测方法 var provider = CreateProvider(testContext); var actualResult = provider.AnyFunction(); // 验证结果与调用行为 Assert.AreEqual(expectedFinalResult, actualResult); // 验证工厂的Create方法被调用过一次 testContext.FingerprintCalculatorFactoryMock.Verify(f => f.Create(), Times.Once); // 验证计算器的Compute方法被传入正确参数调用过一次 testContext.FingerprintCalculatorMock.Verify(c => c.Compute(inputParam), Times.Once); }
额外说明
- 测试方法返回值应为
void(NUnit中[Test]方法默认无需返回值,异步测试才返回Task) - 业务代码中
AnyFunction是同步方法,不需要使用await - 必须通过
Mock.Object获取Mock的实际实例,而非用It.IsAny返回空值 - 添加验证步骤可以确保依赖组件按预期交互,让测试逻辑更健壮
内容的提问来源于stack exchange,提问作者Doraemon
相关产品推荐
相关产品推荐

