3

最近、単体テストのシステム プロパティをロードできるソリューションを見つけました。テストを個別に実行する場合はうまく機能しますが、テスト スイート全体を実行することを選択すると失敗します。誰かが理由を教えてもらえますか?

最初のステップは、テスト アプリケーション コンテキストをロードすることです。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/applicationContext-test.xml")

次のステップは、システム プロパティをロードするクラスを作成することです。

import java.io.InputStream;
import java.util.Properties;

import javax.annotation.PostConstruct;

import org.springframework.core.io.Resource;

public class SystemPropertiesLoader{

    private Resource resource;

    public void setResource(final Resource resource){
        this.resource = resource;
    }

    @PostConstruct
    public void applyProperties() throws Exception{

        final Properties systemProperties = System.getProperties();

        final InputStream inputStream = resource.getInputStream();

        try{
            systemProperties.load(inputStream);
        } finally{
            inputStream.close();
        }
    }
}

最後のステップは、これをテスト アプリケーション コンテキストで Bean としてリストすることです。

<bean class="com.foo.SystemPropertiesLoader">
    <property name="resource" value="classpath:localdevelopment_Company.properties" />
</bean>

テスト スイートを実行すると、すべてシステム プロパティに依存するいくつかのテストが失敗します。特定のテストに行って実行すると、合格します。私はそれをデバッグし、SystemPropertiesLoader のコードが実行されていること、および他のすべての Bean がコンテキストから正常にプルされていることを確認しました。ただし、プロパティにアクセスしようとするとすべて null になるため、プロパティが正しく読み込まれません。助言がありますか?

4

3 に答える 3

3

いくつかのアイデア:

  1. 単体テストを行っている場合は、個々のテスト ケースごとに必要なプロパティを設定しないでください。スプリングを使用してグローバル変数を設定する意味はありません。
  2. なぜシステム プロパティを使用するのですか。Spring は、Bean に注入できるプロパティ オブジェクトを管理します。それらは appContext.xml でセットアップでき、システム プロパティを使用してそこで初期化することもできます (PropertyPlaceHolderConfigurer を参照)。コードにシステム プロパティにアクセスさせることは、Spring の哲学そのものに反します。
  3. とにかく、ファイルからシステム プロパティを設定するのはかなり間違っています。通常、システム プロパティを使用して、プロパティ ファイルの設定をオーバーライドします。
于 2010-11-30T17:34:37.520 に答える
2

問題は、Properties クラスの値が静的に定義されていたことです。したがって、ソリューションを破ったケースは次のとおりです。

  1. テスト A が実行されます。テスト A は applicationContext-test.xml をロードしませんが Properties クラスの値を使用するコードを呼び出します。
  2. これで、Properties クラスのすべての値が永続的に定義されます。
  3. テスト B が実行されます。テスト B は、applicationContext-test.xml を読み込みます。
  4. SystemPropertiesLoader が実行され、値がシステム プロパティに読み込まれます。
  5. 値は Properties クラスから取得されますが、それらは静的に定義され、以前に割り当てられているため、システム プロパティからの値がそこに取得されることはありません。

結局、最善の解決策は、Properties クラス内でデフォルト値を定義することでした。

于 2010-12-06T22:34:33.787 に答える
0

各テスト ケースが新しい JVM を生成し、Systemプロパティが各テスト ケースに設定されていない可能性はありますか?

JUnit テスト クラスでsetUp()andメソッドを活用してみてください。tearDown()

于 2010-11-30T17:33:41.370 に答える