2011-11-09 17 views
6

春/ JUnitのではあなたは私がテストクラスに特別な注釈を参照してくださいならば、動的に別のXMLコンテキストファイルを追加する必要性を持っているように実行時にスプリングコンテキスト設定を動的に追加しますか?

@ContextConfiguration({"classpath:a.xml", "classpath:b.xml"}) 
として @ContextConfiguration

を使用して、アプリケーションのコンテキストファイルを読み込むことができます。たとえば:

@ContextConfiguration({"classpath:a.xml", "classpath:b.xml"}) 
@MySpecialAnnotation 
class MyTest{ 
... 
} 

上記の例では、私は@MySpecialAnnotationを探してもspecial-context.xmlを追加します。これを行う最善の方法は何ですか?私はこれをしばらく見てきましたが、それはサブクラス化のように私自身ののパラメータの1つであるContextLoaderが最善のアプローチですか?これは正しいです?これを行うより良い方法はありますか?

+0

あなたは、動的とはどういう意味ですか。注釈が静的である、そうでありません実行時に変更しますか? – Ralph

+0

明らかに、それは私が解決しようとしている問題です。私は動的にスプリングの負荷のファイルのリストに新しいコンテキストを追加したいと思います。 –

+0

しかし、その注釈の意味は何ですか? 「今すぐ追加するコンテキストx」をトリガする必要がありますか? – Ralph

答えて

2

それは最善の解決策は、私自身のContextLoaderを作成することで判明。私は抽象的なものを拡張することによってこれをしなかった。

public class MyCustomContextListener extends GenericXmlContextLoader implements ContextLoader { 
    @Override 
    protected String[] generateDefaultLocations(Class<?> clazz) { 
     List<String> locations = newArrayList(super.generateDefaultLocations(clazz)); 
     locations.addAll(ImmutableList.copyOf(findAdditionalContexts(clazz))); 
     return locations.toArray(new String[locations.size()]); 
    } 

    @Override 
    protected String[] modifyLocations(Class<?> clazz, String... locations) { 
     List<String> files = newArrayList(super.modifyLocations(clazz, locations)); 
     files.addAll(ImmutableList.copyOf(findAdditionalContexts(clazz))); 
     return files.toArray(new String[files.size()]); 
    } 

    private String[] findAdditionalContexts(Class<?> aClass) { 
     // Look for annotations and return 'em 
    } 
} 
+0

同じ(スイートではありませんが、テストケースを必要とする)テストケースを追加して作成し、相互チェックして検証するにはどうすればよいですか? – Kathir

2

これを実現するには、おそらくSpring 3.1 Profilesを使用することができます。

あなたが特別というプロファイルに特殊のcontext.xmlで定義された豆を入れた場合は、あなたのクラスに(「特別)@Profileを使用して、特別なプロファイルをアクティブにすることができます。これは、あなたの特別な必要性を除去するであろう

注釈完全に。

関連する問題