我在 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 位。
最佳答案
我从未在测试中实际使用过 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 .
关于在 Windows 7 中使用相对路径的 Java 文件类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14261997/