2017-03-27 6 views
3

以下のクラスの設定があります。Spring:フィールドとコンストラクタの両方の注入を持つクラスの単体テスト

class Base { 
    @Autowired 
    private BaseService service; //No getters & setters 
    .... 
} 

@Component 
class Child extends Base { 
    private final SomeOtherService otherService; 

    @Autowired 
    Child(SomeOtherService otherService) { 
    this.otherService = otherService; 
    } 
} 

私はChildクラスのユニットテストを書いています。 @InjectMocksを使用すると、otherServiceがnullになります。私が使用する場合は、クラスのコンストラクタをテストのセットアップで使用すると、Baseクラスのフィールドはnullになります。

フィールド注入についてのすべての議論は悪いことを知っていますが、BaseChildクラスがそのプロパティを注入する方法を変更することなくこれを解決する方法があるかどうかを知ることにもっと興味がありますか?

ありがとうございます!

public class Test { 
    // Create a mock early on, so we can use it for the constructor: 
    OtherService otherService = Mockito.mock(OtherService.class); 

    // A mock for base service, mockito can create this: 
    @Mock BaseService baseService; 

    // Create the Child class ourselves with the mock, and 
    // the combination of @InjectMocks and @Spy tells mockito to 
    // inject the result, but not create it itself. 
    @InjectMocks @Spy Child child = new Child(otherService); 

    @Before 
    public void before() { 
     MockitoAnnotations.initMocks(this); 
    } 
} 

Mockitoが正しいことを行う必要があります。

+0

はい、Springを使用して注入を行わないでください。モックを作成してテスト設定に注入します。 – duffymo

+0

詳しく説明できますか? モックを作成できますが、モックを挿入することはできません。 '@InjectMocks'を使ってモックを注入すると、' Child'クラスのプロパティはコンストラクタインジェクションを使うので 'null'です。私はテストから 'Base'クラスのプロパティを渡す方法がないので、コンストラクタを使ってテスト中のクラスを初期化することはできません。 – Mubin

+0

テストケースを含めます。 –

答えて

3

ちょうどこれを行います。

+0

'@InjectMocksと@Spyの組み合わせは、結果を注入するようにmockitoに指示しますが、それ自体は作成しません。 ' - これがキーです。ありがとう、トン! – Mubin

関連する問題