38

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

Test a Configuration コンポーネント (@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 を注入する方法はありますか?

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

4

2 に答える 2

36

@Beanはい、あなたは正しい道を進んでいます。モックをクラスに入れること@Configurationは1つのアプローチです。私の経験を説明します。

秘訣は、これらの 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 つの興味深い部分は、テスト クラスinitMocks(this);のメソッドでの の一般的な使用法です。@Before

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

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

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

楽しむ!

于 2013-11-06T10:22:01.803 に答える
3

それは確かにの複製です

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

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

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

于 2013-11-06T10:42:43.303 に答える