如何在JUnit中获取src/test/resources目录的路径?

Ror*_*ory 245 java junit

我知道我可以从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如果您希望测试通过文件系统访问数据,我建议您创建一个目录.这清楚地说明了你在做什么.

  • 从Maven开始工作得很好.在eclipse中,您需要在测试运行器中设置当前工作目录,但命令行maven会为您执行此操作. (9认同)
  • 相反,为什么你不遵循构建实用程序的标准?特别是当它简化你的代码时.使用IntelliJ或Maven,无需设置工作目录.这显然是最简单的解决方案,Eclipse一如既往地痛苦. (9认同)
  • 我不这么认为.如果你只需要一个"新文件(getClass().getClassLoader().getResource("fileNameXYZ.xml")"而​​不需要设置任何东西,你为什么要这样做.既不在Eclipse中也不在Maven中. (4认同)
  • 新文件("src/test/resources/fileXYZ"); 不管用.如果你只是把它放到JUnit测试中,那么既不是Eclipse也不是Maven. (3认同)
  • 对于IntelliJ 2014版本,我还必须更改测试方法/类的Run/Debug配置中的工作目录,如@Steve C所述. (2认同)
  • `Maven自动设置当前工作目录`设置为什么? (2认同)
  • @KorayTugay,它将它设置为包含当前正在构建的模块的 pom.xml 文件的目录。 (2认同)

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

  • 这不一定是个好主意.如果资源在Jar中,这将导致悲伤时期. (29认同)
  • @OliverCharlesworth 那么,如果有 jar 该怎么办? (2认同)

Jea*_*ean 67

我只想使用PathJava 7

Path resourceDirectory = Paths.get("src","test","resources");
Run Code Online (Sandbox Code Playgroud)

干净整洁!

  • 为什么不只使用`path resourceDirectory = Paths.get(“ src”,“ test”,“ resources”);`? (2认同)
  • 嗯,`Paths.get("src", "test", "resources")` 和 `Paths.get("src/test/resources")` 对我来说在 Windows 10 上运行良好。我究竟做错了什么?=) (2认同)

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)

分解:

  1. getClass().getProtectionDomain().getCodeSource().getLocation().toURI()-为您提供URI target/test-classes
  2. resolve(Paths.get("somefile"))-解析someFiletarget/test-classes文件夹。

原始的anwser从这里


Ale*_*ndr 7

@Steve C和@ ashosborne1提供的选项存在差异和限制.我相信它们必须具体说明.

我们File resourcesDirectory = new File("src/test/resources");什么时候可以使用:?

  • 1当测试仅通过maven运行但不通过IDE运行时.
  • 2.1当测试将通过maven或
  • 2.2通过IDE,只有一个项目导入IDE.(我使用"导入"术语,因为它在IntelliJ IDEA中使用.我认为eclipse的用户也会导入他们的maven项目).这将起作用,当您通过IDE运行测试时,工作目录与您的项目相同.
  • 3.1当测试将通过maven或
  • 通过IDE和一个以上的项目3.2被导入到IDE(当你是不是学生,你通常导入多个项目),您通过IDE运行测试之前,您手动配置你的测试工作目录.该工作目录应该引用包含测试的导入项目.默认情况下,导入IDE的所有项目的工作目录只有一个.可能它只是限制IntelliJ IDEA,但我认为所有的IDE都是这样的.而这种必须手动完成的配置并不是很好.使用不同maven项目中的几个测试,但导入一个大的"IDE"项目,迫使我们记住这一点,不要让你放松,从工作中获得乐趣.

@ ashosborne1提供的解决方案(我个人更喜欢这个)需要在运行测试之前必须完成2个额外的要求.以下是使用此解决方案的步骤列表:

  • 在"src/test/resources /"中创建一个测试文件夹("teva")和文件("readme"):

    SRC /测试/资源/梯瓦/自述

    必须在测试文件夹中创建文件,否则它将无法工作.Maven忽略空文件夹.

  • 至少一次通过构建项目mvn clean install.它也将运行测试.仅通过maven运行测试类/方法而不构建整个项目可能就足够了.因此,您的测试资源将被复制到测试类中,这是一个路径:target/test-classes/teva/readme
  • 之后,您可以使用@ ashosborne1已经提供的代码访问该文件夹(对不起,我无法在此项目列表中正确编辑此代码):
public static final String TEVA_FOLDER = "teva"; ... 
URL tevaUrl = YourTest.class.getClassLoader().getResource(TEVA_FOLDER); 
String tevaTestFolder = new File(tevaUrl.toURI()).getAbsolutePath();
Run Code Online (Sandbox Code Playgroud)

现在,您可以根据需要多次通过IDE运行测试.直到你运行mvn clean.它将删除目标文件夹.

在通过IDE运行测试之前,首先在测试文件夹中创建文件并运行maven是必需的步骤.如果没有这些步骤,如果您只是在IDE中创建测试资源,然后编写测试并仅通过IDE运行它,您将收到错误.通过mvn运行测试将测试资源复制到target/test-classes/teva/readme中,并且可以为类加载器访问它们.

您可能会问,为什么我需要在IDE中导入多个maven项目以及为什么这么多复杂的东西呢?对我来说,主要动机之一是:保持与IDA相关的文件远离代码.我首先在IDE中创建一个新项目.这是一个假项目,只是IDE相关文件的持有者.然后,我导入已经存在的maven项目.我强制这些导入的项目只将IDEA文件保存在我原来的假项目中.因此,我在代码中看不到与IDE相关的文件.SVN不应该看到它们(请不要提供配置svn/git来忽略这些文件).这也很方便.

  • @HuyHómHỉnh,我建议不要这样做.我担心你会走错方向.资源文件所在的某些地方,所有其他地方都知道这些地方.更容易维护此类项目.即使对你来说它也会更容易,你只需要了解maven项目的结构.但可以肯定的是,您可以使用[https://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html]配置默认资源位置 (2认同)

Noo*_*oor 5

我使用的最简单,干净的解决方案是,假设测试类的名称为,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)