1

Maven2 単体テストで混乱する動作が発生しています。次のテスト コードでは、Eclipse と Maven2 で実行した結果が異なります。

File f = new File( JUnitConstants.TEST_FILE );
File root = new File( "." );
Log.info( "File Info:" );
Log.info( f.toString() + (f.exists() ? " exists" : " doesn't exist") );
Log.info( f.getAbsoluteFile().toString() + (f.getAbsoluteFile().exists() ? " exists" : " doesn't exist") );
Log.info( root.toString() + (root.exists() ? " exists" : " doesn't exist") );
Log.info( root.getAbsoluteFile().toString() + (root.getAbsoluteFile().exists() ? " exists" : " doesn't exist") );

Eclipse では、すべてが存在し、単体テストは正常に実行されます。Maven では、f.exists() メソッドは false を返します。そのため、ファイルが存在しないと見なされます。Maven 実行テストの出力は次のとおりです。

2013-01-10 09:50:51,737 [main] INFO  - File Info:
2013-01-10 09:50:51,737 [main] INFO  - target\test-classes\test\test.img doesn't exist
2013-01-10 09:50:51,737 [main] INFO  - C:\Users\me\code\HEAD\modules\project\target\test-classes\test\test.img exists
2013-01-10 09:50:51,737 [main] INFO  - . exists
2013-01-10 09:50:51,737 [main] INFO  - C:\Users\me\code\HEAD\modules\project\. exists

したがって、ファイルは存在し、ルートディレクトリは私が期待するものですが、相対パスを使用しているときにJavaがファイルが存在しないと考えるのはなぜですか?

私は Windows 7、64 ビットを使用しています。JDK 1.6_38 32 ビットを使用。

4

2 に答える 2

1

new File(filepath)テストでコンストラクターを実際に使用したことはありません。私はいつも使っています...

String filepath = "test/test.img"; // relative to src/test/resources
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(filepath);

または、リソースファイルがそれらを使用するテストと同じパッケージ構造にある場合は、より単純な...を使用できます。

String filename = "test.img"; // relative to src/test/resources/package/where/tests/live
InputStream inputStream = getClass().getResourceAsStream(filepath);

これは、Mavenと私のIDEofcoiceであるIntelliJIDEAの両方で常に機能するようです。

上記のコードのわかりやすい説明については、このブログ投稿を参照してください。

于 2013-01-10T17:40:43.790 に答える
0

しばらくして、問題は確実なテストプロセスの分岐であると判断しました。Mavenビルドは、次のようなコマンドでテストを実行します。

cmd.exe /X /C ""C:\Program Files (x86)\Java\jdk1.6.0_38\jre\bin\java" -Djava.library.path=target/test-classes -jar C:\Users\me\AppData\Local\Temp\surefirebooter6580985433891892701.jar C:\Users\me\AppData\Local\Temp\surefire8381564625923782274tmp C:\Users\me\AppData\Local\Temp\surefire2578536694398675625tmp"

コマンドラインからこれらの正確なパラメーター(引用符内)を使用してJavaを実行でき、すべてが機能しますが、それらを別のコマンドウィンドウ(cmd.exe / X / C)にフォークすると、同じように失敗します。

pom.xmlファイルでフォークを無効にすることでこれを解決しました:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>-Djava.library.path=target/test-classes</argLine>
        <forkMode>never</forkMode>
    </configuration>
</plugin>

他のWindows764ビットコンピューターにはこの問題がないため、これはまだ私のシステム構成にあるはずですが、フォークをオフにすることは解決策のようです。

于 2013-02-05T17:14:02.440 に答える