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

无法在Mock对象上设置属性的问题排查求助

解决Moq Mock对象属性设置不生效的问题

问题根源

  1. 当Mock接口(IMockedClass)时,调用Mock对象的MethodWhichSetsProperty不会执行MockedClass中的实际方法逻辑——Moq对接口的Mock方法默认是空实现,自然不会触发MyProperty的赋值操作。
  2. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:36:29