web-dev-qa-db-ja.com

JUnitテストに必要なBeanのみをロードするようにspringに指示する方法は?

高度な答えがあるかもしれない簡単な質問。

質問:私の質問は、特定のJUnitテストに必要な、アプリケーションコンテキストのクラスのみをインスタンス化する方法はありますか?

理由:アプリケーションコンテキストが非常に大きくなっています。また、多くの統合テストも行っているので、テストを実行するたびにアプリケーションコンテキスト内のすべてのクラスがインスタンス化され、時間がかかると言うと理解できるでしょう。

例:

クラスFooがバーのみを注入すると言う

public class Foo {

@Inject
Bar bar;

@Test
public void testrunSomeMethod() throws RegisterFault {
    bar.runSomeMethod();
}

しかし、アプリケーションコンテキストにはBean foobarとbarがあります。これが有効なアプリケーションコンテキストではないことは知っていますが、すべてのコードが機能することを保証します。

<beans>
     <bean id="foobar" class="some.package.FooBar"/>
     <bean id="bar" class="some.package.Bar"/>
<beans>

では、テストクラスfooのBarのみをインスタンス化し、FooBarを無視するようにspringに指示するにはどうすればよいですか。

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

19
SandMan

直接的な答えではないので、解決策としてマークしません。しかし、それが役立つことを願っています。

通常、3つのオプションがあります。

  1. VinayVeluriがうまく答えたように。個別のコンテキストを作成し、すべてのテストで個別に起動します。

  2. すべてのテストごとにコンテキストを1回作成します。次のように: junitテストクラス全体でSpringアプリケーションコンテキストを再利用します すべてのテストを一度にテストするための大きな最適化です。

  3. 最初の2つのポイントを混ぜます。テスト目的でのみ1つの小さなコンテキストを作成します。それを模擬して、決してテストされていないものはNPEなどを投げることができます。次のように: MockitoモックをSpring Beanに注入して コンテキスト構築を後押しします。そして、ポイント2のように再利用します。すべてのテストに対して1回ビルドします。個人的に私はそれで行きます。

  4. これは、テストごとに必要な最小限のコンテキストを作成する、ある種のスマートテストランナーに関する回答を待っています。

3
Sarseth

Springコンテキストxml Beanタグにdefault-lazy-init="true"を追加すること(または、起動に時間がかかる特定のBeanにlazy-init="true"を追加することを検討してください。これにより、applicationContext.getBean(class-or-bean-name)で呼び出されるか、@Autowired/@Injectを介してテストに挿入されるBeanのみが作成されます。 (それでも@Scheduled Beanのような他の種類のBeanは作成されますが、それが問題かどうかを確認する必要があります)

(spring Java構成を使用する場合、構成ファイルに@Lazyを追加します)

Caveat-applicationContext.getBean()で明示的に初期化されていないか、applicationContext.getBean()を使用して取得したBeanが使用する依存関係として注入されていないBeanがある場合、そのBeanはLONG​​ER構築または初期化。アプリケーションによっては、失敗する可能性がありますOR not。たぶん、これらのBeanをlazy-init="false"として選択的にマークできます

7
Deepak

はい、テストケースごとにコンテキストを使用してそれを行うことができます。テストケースに必要なBeanを含むテストコンテキストxmlファイルを準備します。

Mavenを使用する場合、test-context.xmlを_src/test/resources_フォルダーの下に配置します。

必要なテストクラスに次のアノテーションを付けます

@ContextConfiguration(locations = "classpath:test-application-context.xml")

これは、テストケースの特定のBeanのみをロードするのに役立ちます。

2種類のテストケースがある場合、

_@Runwith(SpringJUnit4Runner.class)
@ContextConfiguration(locations = "classpath:test-context-case1.xml")
public class TestClassCase1 {}

@Runwith(SpringJUnit4Runner.class)
@ContextConfiguration(locations = "classpath:test-context-case2.xml")
public class TestClassCase2 {}
_
3
VinayVeluri