我知道我可以从src/test/resources加载一个文件:
getClass().getResource("somefile").getFile()
Run Code Online (Sandbox Code Playgroud)
但是我如何获得src/test/resources 目录的完整路径,即我不想加载文件,我只是想知道目录的路径?
Ste*_*e C 272
你不需要搞乱类加载器.事实上,这是一个坏习惯,因为类加载器资源不是 java.io.File对象,当它们在jar存档中时.
Maven在运行测试之前自动设置当前工作目录,因此您可以使用:
File resourcesDirectory = new File("src/test/resources");
Run Code Online (Sandbox Code Playgroud)
resourcesDirectory.getAbsolutePath() 将返回正确的值,如果这是你真正需要的.
src/test/data如果您希望测试通过文件系统访问数据,我建议您创建一个目录.这清楚地说明了你在做什么.
ash*_*ne1 194
尝试使用ClassLoader该类:
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("somefile").getFile());
System.out.println(file.getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)
A ClassLoader负责在课堂上加载.每个班级都有一个参考ClassLoader.此代码File从资源目录返回a .调用getAbsolutePath()它会返回它的绝对值Path.
Javadoc ClassLoader:http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html
Jea*_*ean 67
我只想使用PathJava 7
Path resourceDirectory = Paths.get("src","test","resources");
Run Code Online (Sandbox Code Playgroud)
干净整洁!
Par*_*uti 23
如果它是一个spring项目,我们可以使用下面的代码从src/test/resource文件夹中获取文件.
File file = ResourceUtils.getFile(this.getClass().getResource("/some_file.txt"));
Run Code Online (Sandbox Code Playgroud)
Ant*_*ony 12
我有一个使用JUnit 4.12和Java8的Maven3项目.为了获取名为myxml.xmlunder 的文件的路径src/test/resources,我在测试用例中执行此操作:
@Test
public void testApp()
{
File inputXmlFile = new File(this.getClass().getResource("/myxml.xml").getFile());
System.out.println(inputXmlFile.getAbsolutePath());
...
}
Run Code Online (Sandbox Code Playgroud)
使用IntelliJ IDE在Ubuntu 14.04上测试.参考这里.
Che*_*rry 10
中的所有内容src/test/resources都将复制到target/test-classes文件夹中。因此,要在Maven构建过程中从测试资源获取文件,必须从test-classes文件夹中加载文件,如下所示:
Paths.get(
getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
).resolve(
Paths.get("somefile")
).toFile()
Run Code Online (Sandbox Code Playgroud)
分解:
getClass().getProtectionDomain().getCodeSource().getLocation().toURI()-为您提供URI target/test-classes。resolve(Paths.get("somefile"))-解析someFile到target/test-classes文件夹。原始的anwser从这里取
@Steve C和@ ashosborne1提供的选项存在差异和限制.我相信它们必须具体说明.
我们File resourcesDirectory = new File("src/test/resources");什么时候可以使用:?
IntelliJ IDEA,但我认为所有的IDE都是这样的.而这种必须手动完成的配置并不是很好.使用不同maven项目中的几个测试,但导入一个大的"IDE"项目,迫使我们记住这一点,不要让你放松,从工作中获得乐趣.@ ashosborne1提供的解决方案(我个人更喜欢这个)需要在运行测试之前必须完成2个额外的要求.以下是使用此解决方案的步骤列表:
在"src/test/resources /"中创建一个测试文件夹("teva")和文件("readme"):
SRC /测试/资源/梯瓦/自述
必须在测试文件夹中创建文件,否则它将无法工作.Maven忽略空文件夹.
mvn clean install.它也将运行测试.仅通过maven运行测试类/方法而不构建整个项目可能就足够了.因此,您的测试资源将被复制到测试类中,这是一个路径:target/test-classes/teva/readmeRun Code Online (Sandbox Code Playgroud)public static final String TEVA_FOLDER = "teva"; ... URL tevaUrl = YourTest.class.getClassLoader().getResource(TEVA_FOLDER); String tevaTestFolder = new File(tevaUrl.toURI()).getAbsolutePath();
现在,您可以根据需要多次通过IDE运行测试.直到你运行mvn clean.它将删除目标文件夹.
在通过IDE运行测试之前,首先在测试文件夹中创建文件并运行maven是必需的步骤.如果没有这些步骤,如果您只是在IDE中创建测试资源,然后编写测试并仅通过IDE运行它,您将收到错误.通过mvn运行测试将测试资源复制到target/test-classes/teva/readme中,并且可以为类加载器访问它们.
您可能会问,为什么我需要在IDE中导入多个maven项目以及为什么这么多复杂的东西呢?对我来说,主要动机之一是:保持与IDA相关的文件远离代码.我首先在IDE中创建一个新项目.这是一个假项目,只是IDE相关文件的持有者.然后,我导入已经存在的maven项目.我强制这些导入的项目只将IDEA文件保存在我原来的假项目中.因此,我在代码中看不到与IDE相关的文件.SVN不应该看到它们(请不要提供配置svn/git来忽略这些文件).这也很方便.
我使用的最简单,干净的解决方案是,假设测试类的名称为,TestQuery1并且文件夹中有一个resources目录,test如下所示:
??? java
? ??? TestQuery1.java
??? resources
??? TestQuery1
??? query.json
??? query.rq
Run Code Online (Sandbox Code Playgroud)
要获取TestQuery1do 的URI :
URL currentTestResourceFolder = getClass().getResource("/"+getClass().getSimpleName());
Run Code Online (Sandbox Code Playgroud)
要获取文件之一的URI TestQuery1,请执行以下操作:
File exampleDir = new File(currentTestResourceFolder.toURI());
URI queryJSONFileURI = exampleDir.toURI().resolve("query.json");
Run Code Online (Sandbox Code Playgroud)
小智 5
你可以到达你现在所在的地方
new File(".").getAbsolutePath()
Run Code Online (Sandbox Code Playgroud)
然后你可以导出 src/test/resources 的路径,
通常它只是
new File("src/test/resources")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
324538 次 |
| 最近记录: |