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

单元测试:测试调用工厂类的私有方法时遇空引用异常如何解决?

解决单元测试中的NullReferenceException问题

你遇到的NullReferenceException核心原因是测试代码的Mock配置错误:FingerprintCalculatorFactoryMock.Setup(...).Returns(It.IsAny<IFingerprintCalculator>())这行写法有误——It.IsAny<T>是用于匹配方法参数的语法,不能用来返回实例,它实际会返回null,导致业务代码中calculator变量为空,调用Compute方法时触发空引用异常。

正确的测试实现步骤及代码

  1. 创建IFingerprintCalculator的Mock实例,并为其Compute方法配置预期返回值
  2. 让工厂Mock的Create方法返回这个已配置好的计算器Mock实例
  3. 修正测试方法的规范(比如NUnit中测试方法应为void,同步方法无需await)
  4. 添加验证逻辑,确保依赖方法按预期被调用

修改后的测试代码示例:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:07:24