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

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

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

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

尝试使用类加载器对象:

 ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource("somefile").getFile()); System.out.println(file.getAbsolutePath()); 

编辑来解释更多一点:

类加载器负责加载类,每个类都有一个引用,这个代码是从资源结构返回一个文件,然后通过调用文件的getAbsolutePath获得该文件的绝对path

适用于ClassLoader的Javadoc: http : //docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html

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

Maven在运行testing之前自动设置当前的工作目录,所以你可以使用:

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

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

如果你想让你的testing通过文件系统访问数据,我build议创build一个src/test/data目录。 这清楚地表明你在做什么。

我会简单地使用从Java8的Path

 Path resourceDirectory = Paths.get("src/test/resources"); 

干净整洁!

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

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

我有一个使用JUnit 4.12和Java8的Maven3项目。 为了得到src/test/resources下名为myxml.xml的文件的path,我在testing用例中这样做了:

 @Test public void testApp() { File inputXmlFile = new File(this.getClass().getResource("/myxml.xml").getFile()); System.out.println(inputXmlFile.getAbsolutePath()); ... } 

使用IntelliJ IDEtestingUbuntu 14.04。 在这里引用。

@Steve C和@ ashosborne1提供的选项存在差异和限制。 我相信他们必须被指定。

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

  • 1当testing将通过maven而不是通过IDE运行。
  • 2.1当testing将要通过maven或者运行
  • 2.2通过IDE,只有一个项目被导入到IDE中。 (我使用“导入”这个术语,因为它被用在IntelliJ IDEA中,我觉得eclipse的用户也会导入他们的maven项目)。 这将工作,当您通过IDE运行testing时,导致工作目录与您的项目相同。
  • 3.1当testing将通过maven或者运行
  • 3.2通过IDE,并且多个项目被导入到IDE中(当你不是学生的时候,你通常会导入多个项目), 并且在你通过IDE运行testing之前,手动configuration你的testing工作目录。 该工作目录应该引用包含testing的导入项目。 默认情况下,导入到IDE的所有项目的工作目录只有一个。 可能它只是IntelliJ IDEA一个限制,但是我认为所有IDE都是这样工作的。 而这个必须手动完成的configuration并不好。 使用不同Maven项目中存在的几个testing,但导入到一个大型的“IDE”项目中,迫使我们记住这一点,不要放松,从工作中获得乐趣。

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

  • 在“src / test / resources /”里创build一个testing文件夹(“teva”)和文件(“readme”):

    SRC /testing/资源/梯瓦/自述

    文件必须在testing文件夹中创build,否则将不起作用。 Maven忽略空文件夹。

  • 至less一次通过mvn clean install项目。 它也会运行testing。 通过maven只运行你的testing类/方法而不需要构build整个项目就足够了。 因此,您的testing资源将被复制到testing类中,这里是一个path: 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多次运行testing。 直到你运行mvn clean。 它会放弃目标文件夹。

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

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

我使用的最简单和干净的解决scheme,假设testing类的名称是TestQuery1并且test文件夹中有一个resources目录,如下所示:

 ├── java │  └── TestQuery1.java └── resources └── TestQuery1 ├── query.json └── query.rq 

要获得TestQuery1的URI,请执行以下操作:

 URL currentTestResourceFolder = getClass().getResource("/"+getClass().getSimpleName()); 

要获得TestQuery1文件的URI,请执行以下操作:

 File exampleDir = new File(currentTestResourceFolder.toURI()); URI queryJSONFileURI = exampleDir.toURI().resolve("query.json"); 

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

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