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


Answers

你不需要混淆类加载器。 实际上,这是一个不好的习惯,因为类加载器资源不在 java.io.File对象中时处于jar归档中。

Maven在运行测试之前会自动设置当前工作目录,因此您可以使用:

    File resourcesDirectory = new File("src/test/resources");

如果这是您真正需要的, resourcesDirectory.getAbsolutePath()将返回正确的值。

如果您希望测试通过文件系统访问数据,我建议创建一个src/test/data目录。 这清楚表明你在做什么。

Question

我知道我可以从src / test / resources加载一个文件:

getClass().getResource("somefile").getFile()

但是我怎样才能得到src / test / resources 目录的完整路径,即我不想加载文件,我只想知道目录的路径?




src/test/resources所有内容都被复制到target/test-classes文件夹中。 所以要在Maven构建期间从测试资源中获取文件,您必须从test-classes fodler中加载它,如下所示:

Paths.get(
    getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
).resolve(
    Paths.get("somefile")
).toFile()

分解:

  1. getClass().getProtectionDomain().getCodeSource().getLocation().toURI() - 给你target/test-classes URI。
  2. resolve(Paths.get("somefile")) - 将someFile解析为target/test-classes文件夹。

原始的anwser从此被采取




@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或者运行
  • 3.2通过IDE,并且多个项目被导入到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();

现在,您可以根据需要多次通过IDE运行测试。 直到你运行mvn clean。 它会放弃目标文件夹。

在通过IDE运行测试之前,在测试文件夹内创建文件并首次运行maven是需要的步骤。 如果你没有这些步骤,如果你只是在你的IDE中创建测试资源,然后编写测试并通过IDE运行它,你将会得到一个错误。 通过mvn运行测试将测试资源复制到target / test-classes / teva / readme中,并且它们可以通过类加载器访问。

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




在File对象上使用.getAbsolutePath()。

的getClass()。的getResource( “somefile”)。的GetFile()。getAbsolutePath()




如果是Spring项目,我们可以使用下面的代码从src / test / resource文件夹中获取文件。

File file = ResourceUtils.getFile(this.getClass().getResource("/some_file.txt"));



Links



Tags

java java   junit