2

特定のプロパティに応じて、いくつかの方法のいずれかで実行されるSpringアプリケーションがあります。これは、値の小さなセットの1つである必要があります。アプリケーションが起動すると、このプロパティがファクトリに渡され、それに応じてわずかに異なる Bean 実装がビルドされます。

プロパティがさまざまな値に設定されている場合に機能することを確認するために、このコントロールが機能する統合テストを作成したいと思います。そのため、プロパティを 1 に設定して 1 つのテストを実行し、プロパティを 2 に設定して 1 つのテストを実行する必要があります。各テストでは、必要に応じてプロパティを設定し、構成を再読み込みして、すべてが正しく再構成されるようにする必要があります。

各テストでコンテキストを取得して手動で更新するのは簡単に思えますが、実行時にこれらのさまざまなプロパティをテストに挿入してこれを制御するにはどうすればよいでしょうか? この種の構成を整理するより良い方法はありますか?

4

3 に答える 3

1

2 番目の質問にお答えします...では、この種の構成を整理するためのより良い方法はありますか? あなたの場合は圧倒されるかもしれませんが、Spring Profiles を調べましたか? これは必要なことを実行し、Spring 3.1 で導入された新機能であるため、Spring チームがこの種の問題に対して選択した方法のようです。

ここに素晴らしいチュートリアルがあります: http://blog.springsource.org/2011/06/21/spring-3-1-m2-testing-with-configuration-classes-and-profiles/

于 2013-01-11T11:08:33.930 に答える
1

最終的に、実際にこれを直接行う方法を見つけました。少し面倒ですが、実際にはそれほど悪くはありません。

もともと、テストは @ContextConfiguration で実行され、後で @Before で初期化さnew TestContextManager(getClass()).prepareTestInstance(this);れました (Spring 以外のランナーを使用できるように個別に初期化されました)。

これを拡張して、TestContext が使用可能になるたびに TestContext をテスト自体に取得するテキスト実行リスナーを最初に登録しました。

contextManager.registerTestExecutionListeners(new AbstractTestExecutionListener() {
    @Override
    public void prepareTestInstance(TestContext freshTestContext) throws Exception {
        testContext = freshTestContext;
    }
});

テスト自体は、プロパティの実際の値が何であるかを知ると(残念ながら実際のテストまでではありません)、カスタム PropertyPlaceholderConfigurer にプロパティを挿入します(非常に単純です:resolvePlaceholderをオーバーライドし、以前にプロパティを明示的に設定していない限り、super.resolvePlaceholderを呼び出します)。 、および呼び出し:

testContext.markApplicationContextDirty();
contextManager.prepareTestInstance(this);

これにより、新しく変更されたプロパティ値を使用して、TestContext がアプリケーション コンテキストを再構築します。

最後に、テスト間でプロパティをリセットし、おそらくクラス全体を @DirtiesContext としてマークして、他のテストに干渉しないようにする必要があります。

于 2013-01-14T14:36:38.757 に答える
0

環境を設定する JVM システム プロパティ (「my.env=sit」など) の使用を検討し、使用するプロパティ ファイルを設定者に伝えます。例えば:

<context:property-placeholder   
    location="classpath:db-${my.env}.properties"/>

「my.env」プロパティが「sit」に設定されている場合、明らかに PropertyPlacementConfigurer は「db-sit.properties」というファイルを探します。

ignoreUnresolvablePlaceholderstrueに設定することを忘れないでください。これにより、プロパティが見つからない場合でもコンフィギュアラーが失敗しないことが保証されます。

于 2013-01-11T11:15:45.067 に答える