我在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 - targettest-classestesttest.img doesn't exist
2013-01-10 09:50:51,737 [main] INFO - C:UsersmecodeHEADmodulesprojecttargettest-classestesttest.img exists
2013-01-10 09:50:51,737 [main] INFO - . exists
2013-01-10 09:50:51,737 [main] INFO - C:UsersmecodeHEADmodulesproject. exists
所以,文件存在,根目录是我所期望的,但是为什么Java认为文件不存在,当使用相对路径?
我在Windows 7, 64位;使用JDK 1.6_38 32位
我从未在测试中实际使用过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和我选择的IDE IntelliJ IDEA中工作。
关于上面代码的详细解释,请参阅这篇博文
经过一段时间后,我确定问题是可靠测试过程的分叉。maven构建在如下命令下运行测试:
cmd.exe /X /C ""C:Program Files (x86)Javajdk1.6.0_38jrebinjava" -Djava.library.path=target/test-classes -jar C:UsersmeAppDataLocalTempsurefirebooter6580985433891892701.jar C:UsersmeAppDataLocalTempsurefire8381564625923782274tmp C:UsersmeAppDataLocalTempsurefire2578536694398675625tmp"
我可以用这些确切的参数(引号内)从命令行运行java,一切正常,但是一旦我将它们fork到另一个命令窗口(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位计算机没有这个问题,但是关闭分叉似乎是一个解决方案。