web-dev-qa-db-ja.com

Spring Contextにモックを注入する方法

いくつかのSpringコンテキストを使用しているテストがあります。これらのコンテキストでは、多数のBeanが宣言されます。テストでは、コンテキストのBeanの実際の実装を使用しますが、コンテキストの1つを除き、MOCKを使用します。

(@Configurationアノテーションを使用して)Test a Configurationコンポーネントを作成しようとしましたが、XMLは@Beanアノテーションよりも優先されるため、この方法では機能しません。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"context1.xml", "context2.xml", ...})
@Configuration
public class MyTest{

    @Inject
    private MyTargetBean target;

    private AnotherBean myMock = mock(AnotherBean.class);

    @Bean
    public AnotherBean myMock() { return myMock; }

    .....

私はXMLでモックを定義できることを知っていますが、そのためには、これを行いたいテストごとに追加のXMLファイルが必要になります。この複雑さを避けたい。

XML以外のコンテキストで(モックのような)Beanを注入する方法はありますか?

ありがとうございました!

37
Mr.Eddart

それは確かにの複製です

MockitoモックをSpring Beanに注入する

Springockitoアノテーションはまさに私が探していたものです

https://bitbucket.org/kubek2k/springockito/wiki/springockito-annotations

3
Mr.Eddart

はい、あなたは正しい軌道に乗っており、_@Bean_クラスに模擬_@Configuration_を入れることは一つのアプローチであり、私の経験を説明します:

秘Theは、これらのBeanのライブバージョンを除外するテストのために、純粋に異なる.xmlファイルのセットを使用する必要があることです。

_@ContextConfiguration(locations = {"context1-test.xml", "context2-test.xml", ...})
_

そして、「-test-xml」ファイルは_src/test/resources_に入ります。

少なくともそれは同じことをする私の経験でした。たぶん、モックバージョンでBeanを「オーバーライド」する方法があるかもしれませんが、まだ気づいていません。

また、モック(私は5つありました)をすべて独自の構成にまとめることも選択しました。

_@Configuration
public class MockServicesProvider {
     @Bean
     public AnotherBean myMock() { return mock(AnotherBean.class); }
}
_

この問題のもう1つの興味深い部分は、テストクラスの_@Before_メソッドでのinitMocks(this);の一般的な使用法です。

モックが他の場所で使用されている場合(そして、それがあなたがそれらを配線している理由です...)、initMocks(this)はテスト間でそれらを吹き飛ばします(文字通りではなく、ちょうど新しいモックが作成されます他のオブジェクトに接続されている他のモックは「失われます」)。

これに対する解決策は、各テストの前に_@Before_メソッドでmockitoのreset(mockObject)を呼び出すことでした。新しいモックを作成せずに、同じモックがリセットされます(すべてのwhenと相互作用)。

resetのMockitoのドキュメントは、依存性注入を介して適用されるモックのコンテキストを除いて、このメソッドは実際には使用されないため、このメソッドは一般的に使用されないことを非常に厳しく述べていることに注意してください:)

楽しんで!

35
vikingsteve