如何解决Moq模拟ServiceBusMessageSender时的System.NotSupportedException?
Moq无法Setup方法的问题解决
你遇到的问题核心是Moq只能模拟虚方法、抽象方法或接口定义的成员,而你要Setup的SendMessageToQueue方法是具体类的非虚方法,所以无法被Moq重写。
解决办法有以下几种:
修改原方法为虚方法
如果有权限修改ServiceBusMessageSender的源码,给目标方法加上virtual关键字:public virtual async Task<bool> SendMessageToQueue(MyClass msg, ILogger log);之后就能正常用Moq进行Setup操作。
基于接口抽象重构
如果不能修改原类代码,建议定义一个包含目标方法的接口,让原类实现该接口,然后模拟接口而非具体类:// 定义接口 public interface IServiceBusMessageSender { Task<bool> SendMessageToQueue(MyClass msg, ILogger log); } // 让原类实现接口 public class ServiceBusMessageSender : IServiceBusMessageSender { public async Task<bool> SendMessageToQueue(MyClass msg, ILogger log) { // 原有业务逻辑实现 } } // 测试时模拟接口 _sender = new Mock<IServiceBusMessageSender>(); _sender.Setup(x => x.SendMessageToQueue(It.IsAny<MyClass>(), It.IsAny<ILogger>())).ReturnsAsync(true);继承原类并重写方法(仅适用于原方法可重写场景)
如果原类允许继承,可创建一个测试专用子类,重写目标方法后再模拟该子类:public class TestableServiceBusMessageSender : ServiceBusMessageSender { public override async Task<bool> SendMessageToQueue(MyClass msg, ILogger log) { // 可留空或自定义测试逻辑,后续能被Moq拦截 return await base.SendMessageToQueue(msg, log); } } // 模拟测试子类 _sender = new Mock<TestableServiceBusMessageSender>(); _sender.Setup(x => x.SendMessageToQueue(It.IsAny<MyClass>(), It.IsAny<ILogger>())).ReturnsAsync(true);
内容的提问来源于stack exchange,提问作者Iria
相关产品推荐
相关产品推荐

