私のこれの解釈は、基本的に、基礎となる実装を制御できないが、それでもそれに依存しているものです。これは、独自のコードまたはサードパーティのライブラリにある可能性があります。
何かのようなもの:
class MyClass : BaseConfigurationProvider
{
}
abstract class BaseConfigurationProvider
{
string connectionString;
protected BaseConfigurationProvider()
{
connectionString = GetFromConfiguration();
}
}
これは、接続文字列が返される場所、おそらく構成ファイルまたはおそらくランダムテキストファイルに依存します-いずれにせよ、の単体テストの外部状態処理は困難MyClass
です。
同じことがインターフェースを与えられたのに対して:
class MyClass : IBaseConfigurationProvider
{
string connectionString;
public MyClass(IBaseConfigurationProvider provider)
{
connectionString = provider.GetConnectionString();
}
}
interface IBaseConfigurationProvider
{
string GetConnectionString();
}
少なくとも実装を完全に制御できます。インターフェイスを使用すると、単体テスト中に実装のテストバージョンを使用したり、(上記で行ったように)消費クラスに依存性を注入したりできます。このシナリオでは、接続文字列を解決する必要性に依存しています。テストは、異なる文字列または空の文字列を提供できます。