使用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
相关产品推荐
相关产品推荐

