能否让基类实现不执行任何操作?遗留系统无DI/接口测试咨询
针对Brownfield应用测试的FakeItEasy与Microsoft Fakes方案分析
针对你维护的这个无测试、无DI/接口的复杂brownfield应用,我来梳理下FakeItEasy和Microsoft Fakes在满足“让基类实现不执行任何操作”需求上的可行性,完全贴合你不能用DI或接口的限制:
FakeItEasy的适配情况
- 可行场景:如果你的基类方法是虚方法,FakeItEasy可以直接伪造基类实例,默认情况下所有虚方法都会被拦截,不执行原逻辑(返回对应类型的默认值,比如void方法就啥也不做)。你不需要对原代码做任何重构,只需要在测试里创建伪造的基类对象就行,比如:
var fakeBase = A.Fake<YourBaseClass>(); // 此时调用fakeBase的虚方法,原基类逻辑不会执行 - 局限性:如果基类里的方法是非虚方法、静态方法或者密封方法,FakeItEasy就无能为力了——它的伪造机制依赖继承和虚方法拦截,没法绕过非虚方法的直接调用。这种情况下FakeItEasy帮不到你。
Microsoft Fakes的适配情况
这绝对是更适配你场景的方案,尤其是在你能拿到许可的前提下:
- 核心优势:Microsoft Fakes通过Shim机制可以拦截几乎所有类型的方法调用——不管是虚方法、非虚方法、静态方法,甚至密封类的方法都能搞定,完全不需要原代码有任何接口或虚方法设计,完美适配你的无DI、无接口的brownfield现状。
- 实现“基类方法不执行”的方式:针对你的基类,你只需要在测试项目中启用Fakes,生成对应的Shim类,然后指定方法的替代行为为空操作即可。举个简单的代码示例:
using (ShimsContext.Create()) { // 让基类的DoWork方法啥也不做 ShimYourBaseClass.DoWork = () => {}; // 后续测试中调用该方法时,原基类逻辑不会执行 } - 注意事项:Microsoft Fakes需要Visual Studio Enterprise版本支持,所以你得确认团队能拿到对应的许可。
总结建议
- 如果你的基类方法大多是虚方法,FakeItEasy可以快速满足需求,零重构就能实现基类逻辑不执行;但遇到非虚方法就会卡壳。
- 如果你能拿到Microsoft Fakes的许可,它是完全适配你场景的最优解——不管基类方法是什么类型,都能轻松拦截并让原逻辑不执行,完全不需要修改现有代码结构。
内容的提问来源于stack exchange,提问作者P.Brian.Mackey
相关产品推荐
相关产品推荐

