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

时间:2015-02-23 12:18:02

标签: java junit

我知道我可以使用:

从src / test / resources加载文件
getClass().getResource("somefile").getFile()

但是如何获得src / test / resources 目录的完整路径,即我不想加载文件,我只是想知道目录的路径? / p>

15 个答案:

答案 0 :(得分:242)

你不需要搞乱类加载器。事实上,这是一个坏习惯,因为类加载器资源在jar存档中时不是 java.io.File对象。

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

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

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

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

答案 1 :(得分:163)

尝试使用ClassLoader类:

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

ClassLoader负责在课程中加载。每个班级都有ClassLoader的引用。此代码从资源目录返回File。在其上调用getAbsolutePath()会返回其绝对值Path

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

答案 2 :(得分:54)

我只想使用Java 7中的Path

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

整洁干净!

答案 3 :(得分:21)

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

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

答案 4 :(得分:9)

我有一个使用JUnit 4.12和Java8的Maven3项目。 为了在myxml.xml下获取名为src/test/resources的文件的路径,我在测试用例中执行此操作:

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

使用IntelliJ IDE在Ubuntu 14.04上测试。 参考here

答案 5 :(得分: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或
  • 运行
  • 3.2通过IDE,在通过IDE运行测试之前,将多个项目导入IDE(当您不是学生时,通常导入多个项目), AND ,您手动配置工作测试目录。该工作目录应该引用包含测试的导入项目。默认情况下,导入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来忽略这些文件)。这也很方便。

答案 6 :(得分:7)

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

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文件夹。
  3. 原始anwser取自this

答案 7 :(得分:5)

我使用的最简单,最简洁的解决方案,假设测试类的名称为TestQuery1resources文件夹中有test目录,如下所示:

├── 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");

答案 8 :(得分:1)

使用Spring,您可以轻松地从resources文件夹(main / resources或test / resources)中读取它:

例如创建一个文件:test/resources/subfolder/sample.json

@Test
public void testReadFile() {
    String json = this.readFile("classpath:subfolder/sample.json");
    System.out.println(json);
}

public String readFile(String path) {
    try {
        File file = ResourceUtils.getFile(path);
        return new String(Files.readAllBytes(file.toPath()));
    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}

答案 9 :(得分:1)

{
   "Version": "2012-10-17",
   "Id": "Queue1_Policy_UUID",
   "Statement": [{
      "Sid":"Queue1_SendMessage",
      "Effect": "Allow",
      "Principal": {
         "AWS": [ 
            "111122223333"
         ]
      },
      "Action": "sqs:SendMessage",
      "Resource": "arn:aws:sqs:us-east-2:444455556666:queue1"
   }]  
}

答案 10 :(得分:1)

你可以到达目的地

new File(".").getAbsolutePath()

然后你可以导出src/test/resources的路径
通常只是

new File("src/test/resources")

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

在单元测试中使用以下命令将Hibernate与Spring一起注入:

@Bean
public LocalSessionFactoryBean getLocalSessionFactoryBean() {
    LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
    localSessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml"));
    localSessionFactoryBean.setPackagesToScan("com.example.yourpackage.model");
    return localSessionFactoryBean;
}

如果hibernate.cfg.xml文件夹中没有src/test/resources,则会自动退回到src/main/resources文件夹中的文件。

答案 13 :(得分:0)

在常见情况下,您不能使用资源文件夹中的文件进行测试。原因是资源文件夹中的资源文件存储在jar中。因此,它们在文件系统中没有真实路径。

最简单的解决方案可以是:

  1. 将文件从资源复制到临时文件夹,并获取该临时文件的路径。
  2. 使用临时路径进行测试。
  3. 删除临时文件。
TemporaryFolder中的

JUnit可用于创建临时文件,并在测试完成后将其删除。 guava库中的类用于复制文件表单资源文件夹。

请注意,如果我们在资源文件夹中使用子文件夹,例如good,则不必在资源路径中添加前导/

public class SomeTest {

    @Rule
    public TemporaryFolder tmpFolder = new TemporaryFolder();


    @Test
    public void doSomethinge() throws IOException {
        File file = createTmpFileFromResource(tmpFolder, "file.txt");
        File goodFile = createTmpFileFromResource(tmpFolder, "good/file.txt");

        // do testing here
    }

    private static File createTmpFileFromResource(TemporaryFolder folder,
                                                  String classLoaderResource) throws IOException {
        URL resource = Resources.getResource(classLoaderResource);

        File tmpFile = folder.newFile();
        Resources.asByteSource(resource).copyTo(Files.asByteSink(tmpFile));
        return tmpFile;
    }

}

答案 14 :(得分:0)

使用Spring,您可以使用此功能:

import org.springframework.core.io.ClassPathResource;

// Don't worry when use a not existed directory or a empty directory
// It can be used in @before
String dir = new ClassPathResource(".").getFile().getAbsolutePath()+"/"+"Your Path";