2016-12-23 6 views
0

私のサービス(ClassUnderTest)クラスのユニットテストを書いています。すべてのデータメンバーに@Mockを使用しています。ClassUnderTestのInjectMocksのメリット

ClassUnderTestをテストするには、ClassUnderTestのオブジェクトを作成する必要があります。

私には2つのオプションがあります ClassUnderTestの新しいオブジェクトを作成し、コンストラクタでモックを送信します。

ClassUnderTestには@InjectMocks注釈を使用してください。

私は、2つのアプローチが同じであるか、または@InjectMocksを使用することのいくつかの注意の利点があるのだろうかと疑問に思っていましたか?

@Mock 
private NodeLaunchWorkflowService nodeLaunchWorkflowService; 

@InjectMocks 
private NodeLaunchWorkflowController nodeLaunchWorkflowController; 

または

@Mock 
private NodeLaunchWorkflowService nodeLaunchWorkflowService; 

private NodeLaunchWorkflowController nodeLaunchWorkflowController; 
@Before 
public void setUp() throws JSONException { 
    MockitoAnnotations.initMocks(this); 
    nodeLaunchWorkflowController = new NodeLaunchWorkflowController(nodeLaunchWorkflowService) 
} 

答えて

1

それは全く逆です:いくつかの明確な利点が@InjectMocksではなく、コンストラクタパターンを使用することにあります。特に、@InjectMocks documentationおよびother articlesとして、Mockitoが黙ってモックを注入できないという様々な理由があります。これは、コンストラクタ呼び出しが引き起こす明らかなコンパイルの失敗とは対照的に、無害なクラスの変更がテストで不明瞭な失敗を引き起こす可能性があることを意味します。

特定の自動リファクタリングツールでは、テストが正しく自動的に変更されるようにクラスを変更することさえできます。 @InjectMocksではコンストラクタコールをMockitoの深くまで深く反映させません。

@InjectMocksは、レガシーコードでの素早いユニットテストカバレッジに役立つかもしれませんが、新しい開発では、コンポーネントを容易にテストできるように(例えば、コンストラクタ呼び出しを公開して)構造化し、明確な電話で。

関連する問題