无法在Mock对象上设置属性的问题排查求助
解决Moq Mock对象属性设置不生效的问题
问题根源
- 当Mock接口(
IMockedClass)时,调用Mock对象的MethodWhichSetsProperty不会执行MockedClass中的实际方法逻辑——Moq对接口的Mock方法默认是空实现,自然不会触发MyProperty的赋值操作。 - 使用
SetupGet后属性仍返回null,大概率是Mock配置未正确生效,或是后续代码覆盖了Mock设置。
可行解决方案
方案1:Mock方法行为,主动设置属性
直接配置MethodWhichSetsProperty的调用逻辑,让它被执行时给属性赋值:
MyObject myObject = new MyObject(); Mock<IMockedClass> myMock = new Mock<IMockedClass>(); myMock.SetupAllProperties(); // 配置方法调用时的回调,手动设置属性 myMock.Setup(x => x.MethodWhichSetsProperty(It.IsAny<MyObject>())) .Callback<MyObject>(inputObj => myMock.Object.MyProperty = inputObj); myMock.Object.MethodWhichSetsProperty(myObject); // 此时myMock.Object.MyProperty已被设置为myObject
方案2:Mock实际类并启用基类方法调用
如果需要复用MockedClass中的实际方法逻辑,可以直接Mock该类而非接口,同时开启CallBase让Mock对象执行基类的方法实现:
MyObject myObject = new MyObject(); Mock<MockedClass> myMock = new Mock<MockedClass> { CallBase = true }; myMock.SetupAllProperties(); myMock.Object.MethodWhichSetsProperty(myObject); // 会执行MockedClass中的实际方法,完成属性赋值
方案3:直接配置属性返回值(跳过方法调用)
如果只是想让属性直接返回指定值,无需调用方法,确保SetupGet配置正确即可:
MyObject myObject = new MyObject(); Mock<IMockedClass> myMock = new Mock<IMockedClass>(); myMock.SetupGet(x => x.MyProperty).Returns(myObject); // 直接访问属性即可得到预期值 var targetProperty = myMock.Object.MyProperty; // targetProperty == myObject
若之前此方式返回null,检查是否存在重复Mock配置覆盖了当前设置,或是属性名称/类型匹配错误。
内容的提问来源于stack exchange,提问作者nimitz
相关产品推荐
相关产品推荐

