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 和我的 coice IDE IntelliJ IDEA中都有效。

有关上述代码的详细说明,请参阅此博客文章

于 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>

这仍然必须是我的系统配置中的东西,因为其他 Windows 7 64 位计算机没有这个问题,但关闭分叉似乎是一个解决方案。

于 2013-02-05T17:14:02.440 回答