Mockitoの注釈@Spy
または@InjectMocks
:Mockitoでテストするときは、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をインターフェイスで使用し、実装の宣言を自分で行います。
これは[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)です。 「MyService」を盗んでいるのは、それがインターフェースなので意味をなさない。ここで本当に何を達成したいですか? – Tunaki
あなたが実装をテストしたいのであれば、なぜそれを監視していますか? – Tunaki
ユニットテストは、インターフェイスではなく実装をテストすることになっています。だから私は、実装に対してテストすることで問題は見られない。これは、実装の特定の側面を操作または検証するため、スパイを使用する場合に特に当てはまります。さて、インターフェイスを常に持つという原則は、今日のIDEや他のツールでは限界があります。私はほとんどの場合(私のjavadoc ..を維持するための余分なファイル以外)何も提供していないので、私のアプリケーションで内部的に(いくつかの例外を除いて)インターフェイスを使用して終了しました。 – Tobb