2009-07-02 7 views
0

設定済みのbeanでinit-methodを呼び出さずに、JunitテストケースでSpringの設定をテストしたいと思います。テストケースで設定されたシステムプロパティに基づいて実際の作業をスキップするために私のinitメソッドをコーディングすることができましたが、よりクリーンなソリューションを探しています。Spring - 単体テストでのinitメソッドのスキップ

答えて

3

あなたのJUnitテストは、同じSpringコンテキスト設定ファイルを使用していますか?私は答えが肯定であると推測しています...あなたのテストで代替スプリング設定を使用すると問題が単純化されます。

ので、同様に私が使用したクリーンなアプローチの一つは、いくつかの便利な注釈を利用する。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
public class MovieServiceTest { 
    // ... 
} 

春呼び出し、この「TestContextフレームワーク」とJUnitテストをするために、あるコンテキスト設定ファイルを探します。上記の例では、名前 "MovieServiceTest-context.xml"

あなたはinitメソッドなしでBeanを定義できます。しかし...あなたもそれを試してみませんか?

+0

+1これは最善のアプローチです。 –

+0

このアプローチについては考えていますが、2バージョンのバネ構成を維持する必要があります。私のバックアップ戦略は、単体テストのprodファイルからすべての "init-method"を取り除き、次にアプリケーションのコンテキストを手動で読み込むことです。よりよい解決策が見つからなければ、私がやろうとしていることかもしれません。 –

+0

これは特にファンキーな機能です。私たちはjunit3に固執し始めましたが、junit4が行く方法です。 –

1

これはSpringの設定XMLのbeanのinit-method属性で指定されたinitメソッドですか?もしそうなら、これを達成するために実稼働環境で使用するものからテストを実行するために、別のコンテキストXMLを使用できませんでしたか?

0

あなたは少し古い学校に行き、テストされるクラスを拡張してinitメソッドをオーバーライドすることができます。

また、リファクタリングして、initメソッドが使用するinit戦略オブジェクトを挿入することもできます。

私はtestContext.xmlの道を好むけれども...

0

が見つかりました。解決策を共有するために自分の質問に答えることにしました。 init-methodsを持たないconfigファイルの別のコピーを維持したままの解決策は嫌いです。私の解決策は完璧ではありませんが、仕事は終わりです。

public final static String INIT_METHOD_REGEX = "init-method=\"\\w+\""; 
public final static String DESTROY_METHOD_REGEX = "destroy-method=\"\\w+\""; 
public final static String PROPERTY_REGEX = "\\$\\{[^\\}]+\\}"; 

private static List<List<String>> subs = new ArrayList<List<String>>(); 
static { 
    subs.add(Arrays.asList(new String[] { INIT_METHOD_REGEX, "" })); 
    subs.add(Arrays.asList(new String[] { DESTROY_METHOD_REGEX, "" })); 
    subs.add(Arrays.asList(new String[] { PROPERTY_REGEX, "" })); 
} 

static public void testSpringConfig(String configFile) throws IOException { 
    URL springXml = Thread.currentThread().getContextClassLoader().getResource(configFile); 
    InputStream is = springXml.openStream(); 
    byte[] buffer = new byte[8192]; 
    int readBytes; 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    while ((readBytes = is.read(buffer)) != -1) 
     baos.write(buffer, 0, readBytes); 

    String content = baos.toString(); 
    for (List<String> s : subs) 
     content = content.replaceAll(s.get(0), s.get(1)); 

    ByteArrayInputStream bais = new ByteArrayInputStream(content.getBytes()); 
    InputSource isrc = new InputSource(bais); 

    GenericApplicationContext ctx = new GenericApplicationContext(); 
    XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx); 
    xmlReader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE); 
    xmlReader.loadBeanDefinitions(isrc); 

    ctx.refresh(); 
    ctx.start(); 
    ctx.close(); 
} 
0

このユニットテストまたは統合テストは行われますか?単体テストの場合、コンテキストをロードするべきではないので、initメソッドについて心配する必要はありません。それが統合テストの場合、いくつかのクラス間の相互作用を検証するテストを意味するので、有効なテストを確実にするためにinitメソッドが実際に呼び出されていることを確認する必要があります。

しかし、以前のチャップは頭の爪に当たって、initメソッドを呼び出さない別のコンテキストを使用していました。

関連する問題