いくつかの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を注入する方法はありますか?
ありがとうございました!
それは確かにの複製です
Springockitoアノテーションはまさに私が探していたものです
https://bitbucket.org/kubek2k/springockito/wiki/springockito-annotations
はい、あなたは正しい軌道に乗っており、_@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のドキュメントは、依存性注入を介して適用されるモックのコンテキストを除いて、このメソッドは実際には使用されないため、このメソッドは一般的に使用されないことを非常に厳しく述べていることに注意してください:)
楽しんで!