2012-02-10 14 views
31

ユニットテストでは、いくつかの依存関係をモックする必要があります。クラスを批判してそのインタフェースを嘲笑すること

public class DataAccessImpl implements DataAccess { 
    ... 
} 

Iは、いくつかの指定されたパラメータを用いて提供される場合、いくつかの指定された値を返し、このクラスのモックオブジェクトを設定する必要があります依存関係の1つは、インタフェースを実装するクラスです。それはすなわち、インターフェースまたはクラスをモックする方が良いでしょう対

DataAccess client = mock(DataAccessImpl.class); 

DataAccess client = mock(DataAccess.class); 

は、それが点で任意の違いを確認していた場合、私はのわからないものを今

は、ありますテストする?好ましい方法は何でしょうか?

+1

ここでは、クラスをモックすることに関する他の考えがあります。ニース読んで、imho:http://stackoverflow.com/questions/1595166/why-is-it-so-bad-to-mock-classes – guerda

答えて

38

TDD(Test Driven Development)に従えば、通常は実装クラスを書く前に単体テストを書くことができるので、インターフェイスを模擬するのが好ましい方法です。したがって、具体的なクラスDataAccessImplを持っていなくても、インタフェースDataAccessを使ってユニットテストを書くことができます。

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

6

です。あなたのコードがインターフェイスではなくクラスに依存する場合は、有効な単体テストを書くためにクラスをモックする必要があります。

+13

またはテストに耳を傾け、コードはインターフェイスに依存するように、おそらくすべきだ。 – blank

6

ほとんどの場合、技術的には違いはなく、インターフェイスとしてクラスとしてモックできます。概念的には、より良い抽象化のためにインタフェースを使用する方が良いです。

2

インターフェイス経由でのみ使用し、一部のモックではない場合は、あなたの内的感情以外の違いはありません。クラスを嘲笑しても、使用されていないパブリックメソッドを模擬しますが、それは考慮する必要はありません。

3

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

+0

これは興味深いことですが、インターフェイスを嘲笑することでこれをどのように達成できますか?私はインターフェイスを模擬することができますが、私はLiskov Substitutionに違反する可能性があります。 – karlihnos

+0

@karlihnos私が提供したリンクは、「関数[...]は派生クラスのオブジェクトを知ることなく使用できる必要があります。つまり、実装ではなくインターフェイスにプログラミングする必要があります。したがって、テスト中のクラスでは、インターフェイスにプログラミングすることによってLSPを達成するのに役立ちます。もちろん、これを実行しても、嘲笑されたインタフェース実装がLSPに準拠するかどうかについては何も言いません。 – jordan

関連する問題