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

使用AutoMock XUnit模拟受保护方法时如何正确注入依赖对象

问题根因

  • 实例不统一:mock.Mock<SystemUnderTest>(parm1, parm2) 生成的带构造参数、已配置Protected方法的模拟实例,和后续mock.Create<SystemUnderTest>()生成的实例是完全独立的两个对象。后者没有传入任何构造参数,Autofac默认选择参数最少的无参构造函数实例化,因此依赖全为空。
  • 构造参数未传递到创建步骤:就算要通过Create方法实例化,也需要把构造参数传入Create方法,否则不会触发带参构造。

修复方案

直接使用你已经配置好的模拟实例的Object属性作为测试目标,不需要重复调用Create方法,修改后的测试代码如下:

[Fact]
public void Test()
{
    using (var mock = AutoMock.GetLoose())
    {
        Depdency1 depdency1 = new Depdency1();
        Depdency2 depdency2 = new Depdency2();

        var parm1 = new NamedParameter("dependency1", depdency1);
        var parm2 = new NamedParameter("dependency2", depdency2);

        // Mock protected方法同时传入构造参数,直接获取配置好的实例
        var sutMock = mock.Mock<SystemUnderTest>(parm1, parm2);
        sutMock.Protected()
           .Setup<bool>("IsOrderValid", "TestOrder")
           .Returns(true);

        // 直接用已经配置好的模拟实例,不需要重新Create
        var sut = sutMock.Object;

        sut.ProcessOrder("Test");
    }
}

额外注意点

你后续正式代码删除无参构造函数后,Autofac找不到无参构造,会自动匹配参数匹配的带参构造,也能从根源避免出现构造函数选择错误的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:27:08