我在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 run test的输出:
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位。
答案 0 :(得分: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。
有关上述代码的详细说明,请参阅this blog post。
答案 1 :(得分: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位计算机没有此问题,但关闭分叉似乎是一种解决方案。