构造函数注入

构造函数注入是注入整个类所依赖的依赖项的最安全的方法。这种依赖关系通常被称为不变量,因为在不提供类的情况下无法创建类的实例。通过要求在构造中注入依赖项,可以保证不能在不一致的状态下创建对象。

考虑一个需要在错误条件下写入日志文件的类。它依赖于 ILogger,可以在必要时注入和使用。

public class RecordProcessor
{
    readonly private ILogger _logger;

    public RecordProcessor(ILogger logger)
    {
        _logger = logger;
    }

    public void DoSomeProcessing() {
        // ...
        _logger.Log("Complete");
    }
}

有时在编写测试时,你可能会注意到构造函数需要的依赖性比测试用例实际需要的依赖性要多。你拥有的此类测试越多,你的类就越有可能违反单一责任原则 (SRP)。这就是为什么在测试类初始化阶段为所有注入的依赖项模拟定义默认行为并不是一个很好的做法,因为它可以屏蔽潜在的警告信号。

单位测试将如下所示:

[Test]
public void RecordProcessor_DependencyInjectionExample()
{
    ILogger logger = new FakeLoggerImpl(); //or create a mock by a mocking Framework
    
    var sut = new RecordProcessor(logger); //initialize with fake impl in testcode

    Assert.IsTrue(logger.HasCalledExpectedMethod());
}