如何在不破坏被测代码的情况下注入Fake?构造函数注入代码调整
构造函数注入的正确实现方案
要解决这个问题,核心是给被测类添加双构造函数,兼顾运行时的默认依赖和测试时的Fake注入需求:
- 为被测类保留一个无参构造函数,在这个构造函数内部实例化
FileExtensionManager,供程序正常运行时调用 - 同时提供一个接收
IExtensionManager参数的构造函数,专门用于测试时注入FakeExtensionManager
以下是完整的被测类代码示例:
public class FileValidator { private readonly IExtensionManager _mgr; // 程序运行时默认调用:实例化真实的FileExtensionManager public FileValidator() { _mgr = new FileExtensionManager(); } // 测试时调用:注入Fake实现 public FileValidator(IExtensionManager mgr) { _mgr = mgr; } public bool IsValidFileName(string fileName) { return _mgr.IsValid(fileName); } }
两种场景的使用方式:
- 程序运行时:直接创建被测类实例,无需额外配置,内部自动使用真实的
FileExtensionManager:var validator = new FileValidator(); bool isValid = validator.IsValidFileName("document.pdf"); - 测试时:创建
FakeExtensionManager实例,通过带参构造函数注入,实现隔离测试:[Test] public void IsValidFileName_WithFakeManager_ReturnsExpectedResult() { var fakeManager = new FakeExtensionManager { IsValidResult = true }; var validator = new FileValidator(fakeManager); Assert.IsTrue(validator.IsValidFileName("test.txt")); }
这种方式既保证了程序运行时的正常逻辑,又满足了单元测试时依赖替换的需求,完美契合《单元测试的艺术》中构造函数注入的设计思路。
内容的提问来源于stack exchange,提问作者bokabokaboka
相关产品推荐
相关产品推荐

