Moq.Object创建实例单元测试失败:Mock预设返回值未生效问题
问题原因与修复方案
根因分析
你当前的代码逻辑存在两处核心问题:
- 构造函数中注入的
IMyClass实例没有被存储为类成员,后续业务逻辑完全没有用到该Mock实例 DoSomething方法调用的是MyClass类自身实现的MyMethod方法,该方法固定返回false,和你预设的Mock返回值没有任何关联
修复方案
根据你的业务设计意图,有两种常见修复路径:
路径1:保持装饰器模式设计
如果你的MyClass是装饰器实现,需要依赖注入另一个IMyClass实例做能力增强,修改MyClass代码如下:
public class MyClass : IMyClass { // 新增私有成员存储注入的依赖 private readonly IMyClass _innerMyClass; public MyClass(IMyClass innerMyClass) { _innerMyClass = innerMyClass; } public bool MyMethod() { // 调用注入实例的方法 return _innerMyClass.MyMethod(); } public string DoSomething() { if(MyMethod() == false) { return "did something"; } else { return "did something else"; } } }
原有测试代码不需要修改,运行即可符合预期。
路径2:仅Mock当前类的方法
如果你的设计不需要额外注入IMyClass依赖,只是想MockMyClass自身的MyMethod方法做单元测试,做两处修改:
- 修改
MyClass的MyMethod为虚方法:
public virtual bool MyMethod() { return false; }
- 调整测试代码,直接Mock
MyClass类型:
[TestMethod] public void MyMethodTest() { var moq = new Mock<MyClass>(); moq.Setup(m => m.MyMethod()).Returns(true); var sut = moq.Object; Assert.AreEqual(sut.DoSomething(), "did something else"); }
内容的提问来源于stack exchange,提问作者CB4
相关产品推荐
相关产品推荐

