如何在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()