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

如何在不破坏被测代码的情况下注入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);
    }
}

两种场景的使用方式:

  1. 程序运行时:直接创建被测类实例,无需额外配置,内部自动使用真实的FileExtensionManager:
    var validator = new FileValidator();
    bool isValid = validator.IsValidFileName("document.pdf");
    
  2. 测试时:创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:16:16