建構函式注入

建構函式注入是注入整個類所依賴的依賴項的最安全的方法。這種依賴關係通常被稱為不變數,因為在不提供類的情況下無法建立類的例項。通過要求在構造中注入依賴項,可以保證不能在不一致的狀態下建立物件。

考慮一個需要在錯誤條件下寫入日誌檔案的類。它依賴於 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());
}