2016-04-28 6 views
0

Mockitoの注釈@Spyまたは@InjectMocksMockitoでテストするときは、Interfaceの代わりにImplementationを使用することをお勧めしますか?インターフェイスでは動作しません

@Spyで注釈さフィールドはMockitoによって初期化することができます。Spy@InjectMocksための似たような)上の文書から

public interface MyService() {} 

public class MyServiceImpl implements MyService {} 


@RunWith(MockitoJUnitRunner.class) 
public class MyServiceTest { 

    @Spy 
    @InjectMocks 
    private MyService myService; // won't work 

    @Mock 
    MyDao myDao; 

    // tests 
} 

引数のコンストラクタがゼロ()の型(プライベートであっても)である場合しかし、 Mockitoは、内部クラス、ローカルクラス、抽象的な クラスとインタフェースをインスタンス化することはできません。 @Spyで注釈が付けられたフィールドは、宣言ポイントで明示的に初期化された にすることができます。あるいは、 インスタンスを提供しない場合、Mockitoはゼロ引き数 コンストラクタ(プライベート)を見つけようとし、インスタンスを作成しようとします。しかし、Mockito は、内部クラス、ローカルクラス、抽象クラス、および インターフェイスをインスタンス化することはできません。

私はスパイへのインタフェースを使用できないことを理解しています。これは、インターフェイスの宣言/初期化時に実際の実装クラスを使用するときに機能します。

この種の問題に対処するには、以下の解決策がどれほどベストですか?

解決方法1:

@InjectMocks 
    private MyService myService = new MyServiceImpl(); // Program against Interface 

解決方法2:

@Spy 
    @InjectMocks 
    private MyServiceImpl myService; // Program against implementation 

私の質問は、それが解決策2を使用し、Mockitoはインスタンス化(しかし、その手段を扱うようにすると良いでしょうかどうかでありますインターフェイスの代わりに実装を宣言する)、またはソリューション1をインターフェイスで使用し、実装の宣言を自分で行います。

+1

これは[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)です。 「MyService」を盗んでいるのは、それがインターフェースなので意味をなさない。ここで本当に何を達成したいですか? – Tunaki

+1

あなたが実装をテストしたいのであれば、なぜそれを監視していますか? – Tunaki

+0

ユニットテストは、インターフェイスではなく実装をテストすることになっています。だから私は、実装に対してテストすることで問題は見られない。これは、実装の特定の側面を操作または検証するため、スパイを使用する場合に特に当てはまります。さて、インターフェイスを常に持つという原則は、今日のIDEや他のツールでは限界があります。私はほとんどの場合(私のjavadoc ..を維持するための余分なファイル以外)何も提供していないので、私のアプリケーションで内部的に(いくつかの例外を除いて)インターフェイスを使用して終了しました。 – Tobb

答えて

0

ありがとうございました。それは私をたくさん助けました。私はこの質問を今閉じます。

基本的に私は実装に対してテストする必要があります。私はまた、より有用な情報を含むthis questionを参照したいと思う。

関連する問題