2016-05-26 7 views
1

AntをMaven(3.3.3、重要な場合)から使用することから私たちのレガシービルドを変換しています。私たちのコードベースには、システムプロパティからプライベート静的フィールドを初期化するクラスがあります。これは通常、アプリケーション呼び出し時の起動スクリプトによって生成されます。このコードを実行する単体テストは、テストを実行する前にシステムのプロパティを設定しています。 AntまたはEclipse JUnitランナーを使用して単体テストを実行すると、すべて正常に動作します。 Mavenを実行すると、ユニットテストが実行される前に静的フィールドが初期化され、プロパティが存在しなくなり、テストが失敗するように見えます。JUnitクラスローダーは、システムプロパティと静的フィールドでMavenに移動するときに問題が発生します。

実際のコードをここに掲載することは許可されていないため、サンプルクラスと単体テストを組み合わせてデモンストレーションしました。

package foo.bar; 

public class ValueClass { 
    private static final String SAMPLE_FIELD = "Foo " + System.getProperty("target.value"); 

    private final myValueField; 

    public ValueClass() { 
     myValueField = "random text " + SAMPLE_FIELD; 
    } 

    public String getValueField() { 
     return myValueField; 
    } 
} 

と、対応するユニットテスト:

​​

私が述べたように、私はAntのか、Eclipseを使用して実行すると、すべてが正常に動作します。私はいくつかのログ(ValueClassの静的ブロックにいくつかのログメッセージを落とす)を行い、EclipseやAntで実行すると、testGetValueFieldメソッドの実行中にクラスがロードされ、MavenではクラスがロードされるsetupBeforeClassesメソッドが実行される前のいつか。これにより、SAMPLE_FIELDが "target.value"システム・プロパティーからのヌル値で初期化されます。

すべてのヘルプは大歓迎です! ロブ

+0

だけのMavenでこれを試してみました...だけで正常に動作します。 – Renato

+0

IntelliJからも動作します...この問題の原因は何でも、それはMavenではないようです...あなたのPOMをクリーンアップするかもしれません、いくつかのプラグインはテストを実行する前にクラスをインスタンス化するかもしれませんか? – Renato

+0

これは良い考えです...他のテストでValueClassを使用して他のものを検索します。 Eclipseでスタンドアロンモードでテストしていたとき、私はそのクラスを1つだけ実行していました。 –

答えて

1

あなたは@BeforeClass方法とtry thisからそれをやって停止し、その後、pom.xmlからシステムのプロパティを設定することができる場合:

<project> 
     [...] 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.19.1</version> 
     <configuration> 
      <systemPropertyVariables> 
      <propertyName>propertyValue</propertyName> 
      <buildDirectory>${project.build.directory}</buildDirectory> 
      [...] 
      </systemPropertyVariables> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
     [...] 
</project> 
+0

これはうまくいきました... Eclipseでテストを実行するためのサポートを維持するために、元のsetupBeforeClassesメソッドをそこに保持して、両方のシナリオの初期化を複製する必要があります。私はそれを先に進め、それからちょうどコメントします。関連するノートでは、2つのクラスローダの型が異なる動作をする理由を知っていますか? –

+0

上記のコメントからの提案の後、私はテストの実行順序を調べ、ValueClassを参照する別のテストがあります。クラスローダーが異なる(恐ろしい)のではなく、単体テストは別の順番で実行されています(それははるかに恐ろしいものではありません)。 –

+0

偶然、Eclipseで働いていました... MavenとEclipseから行うことができるすべてのテストをフォークしない限り、テストは動作した順序でテストが実行されたばかりですが、JVMを開始するのは高価ですそれぞれのテスト、それを回避しようとする必要があります。 – Renato

関連する問題