2011-12-14 7 views
54

JUnitテストケース(統合テスト)は数多くあり、それぞれ異なるテストクラスに論理的にグループ化されています。への道があれば我々はテストクラスごとに一度Springアプリケーションコンテキストをロードし、しかしながら、http://static.springsource.org/spring/docs/current/spring-framework-reference/html/testing.htmljunitテストクラス間でのSpringアプリケーションコンテキストの再利用

で述べたように、JUnitテストクラス内のすべてのテストケースのためにそれを再利用することができます

は、私たちは思っていましたJUnitテストクラスの束に対して、Springアプリケーションコンテキストを1回だけロードします。

FWIWでは、Spring 3.0.5、JUnit 4.5を使用し、Mavenを使用してプロジェクトをビルドします。

+0

以下の回答のすべてが素晴らしいですが、私はのcontext.xmlを持っていません。私は忘却に自分の道を注釈しましたか? context.xmlなしでこれを行う方法はありますか? – markthegrea

答えて

67

はい、これは完全に可能です。同じlocationsが二度目に表示された場合は、春が作成するのではなく、同じコンテキストを使用していますので、locations属性によって

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

春のキャッシュアプ​​リケーションコンテキスト:あなたがしなければならないすべてはあなたのテストクラスで同じlocations属性を使用することです新しいもの。

私はこの機能についての記事を書いた:Speeding up Spring integration tests。また、Springのドキュメントの詳細については、9.3.2.1 Context management and cachingで説明しています。

これは興味深い意味を持っています。 SpringはJUnitがいつ完了するかを知らないので、すべてのコンテキストを永久にキャッシュして、を閉じ、JVMのシャットダウンフックを使用して閉じます。この動作(特に、異なるlocationsのテストクラスが多い場合)は、過度のメモリ使用やメモリリークなどを招く可能性があります。キャッシングコンテキストのもう1つの利点

+0

ああ!それを理解していない。私たちはこのアプローチに長い間従ってきましたが、私は(誤って)テスト実行のための長い時間を、すべてのテストクラスのバーンコンテキストロードに帰しました。今すぐ慎重にチェックします。ありがとう。 – Ramesh

+0

私はむしろ、春にはあなたのテストケースの実行順序について知識がないと言うでしょう。この結果、コンテキストが後で必要となるかどうかを判断することはできません。 – philnate

+1

これは実際にどのように真実になるかわかりません。 Eclipse/JUnitは、Run As/JUnitテストを行うたびに環境をクルクアップするのに2分を費やします。キャッシュされたものがあれば、これは起こりません。 – user1944491

22

Tomasz Nurkiewicz's answerに追加すると、Spring 3.2.2 @ContextHierarchyの注釈を使用して、関連する複数のコンテキスト構造を分離することができます。これは、複数のテストクラスが(たとえば)メモリ内のデータベース設定(データソース、EntityManagerFactory、txマネージャなど)を共有したい場合に役立ちます。例えば

@ContextHierarchy({ 
    @ContextConfiguration("/test-db-setup-context.xml"), 
    @ContextConfiguration("FirstTest-context.xml") 
}) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class FirstTest { 
... 
} 

@ContextHierarchy({ 
    @ContextConfiguration("/test-db-setup-context.xml"), 
    @ContextConfiguration("SecondTest-context.xml") 
}) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class SecondTest { 
... 
} 

「テスト-DB-セットアップのcontext.xml」を使用してコンテキストは一度だけ作成されますが、その中の豆は、個々のユニットテストのに注入することができるこの設定を持つことではコンテキスト手動で

より:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#testcontext-ctx-management(「context hierarchy」で検索)

+0

私はマルチモジュールのmavenを持っています。サービスモジュールのデータベース設定を避けようとしています(すでにデータアクセスモジュールのテストがロードされています)。 –

+2

これは私のために働いた!ありがとう。 @ContextHierarchyアノテーションなしで、springは各テストに対してmy dbをロードします。私は "クラス"パラメータを使用しています:@ContextConfiguration(classes = {JpaConfigTest.class、... – Brel

+4

これはコンテキスト定義のXMLを使用するのではなく、アノテーションで完全に行うことができますか? –

関連する問題