web-dev-qa-db-ja.com

クラスのモックとインターフェースのモック

単体テストでは、いくつかの依存関係を模擬する必要があります。依存関係の1つは、インターフェイスを実装するクラスです。

public class DataAccessImpl implements DataAccess {
    ...
}

いくつかの指定されたパラメーターが提供されると、指定された値を返すこのクラスのモックオブジェクトを設定する必要があります。

今、私が確信していないのは、インターフェースまたはクラスをモックする方が良いかどうか、つまり.

DataAccess client = mock(DataAccess.class);

vs.

DataAccess client = mock(DataAccessImpl.class);

テストに関して違いはありますか?望ましいアプローチは何でしょうか?

40
helpermethod

あなたのケースではそれほど違いはないかもしれませんが、通常はTDD(テスト駆動開発)に従う場合、実装クラスを記述する前であってもユニットテストを記述することができます。したがって、具体的なクラスDataAccessImplがなくても、インターフェイスDataAccessを使用して単体テストを作成できます。

さらに、モックフレームワークにはモッククラスに制限があり、一部のフレームワークはデフォルトでインターフェイスのみをモックします。

45
Kuldeep Jain

場合によります。コードがインターフェイスではなくクラスに依存している場合は、クラスをモックして有効な単体テストを作成する必要があります。

6
onof

ほとんどの場合、技術的には違いはなく、インターフェイスとしてインターフェースを作成することができます。概念的には、抽象化が優れているため、インターフェースを使用することをお勧めします。

6

Liskov Substitution Principal( https://stackoverflow.com/a/56904/35711 )に準拠していることを確認するのに役立つため、インターフェイスをモックする必要があります。

3
jordan

インターフェースを介してのみ使用し、部分的なモックではない場合、あなたの内面の感覚以外に違いはありません。クラスのモックは、クラスにそれらがあれば、使用されていないパブリックメソッドもモックしますが、それは考慮すべきことではありません。

2