如何在单元测试中读取配置文件?

3

我有一个标准的Maven项目结构。
一些配置文件存储在src/main/conf中。
现在我想在src/test中读取这些文件(例如从这些文件中读取属性)。
我应该如何做到这一点?


我不确定我理解了。是什么阻止你在测试中以与生产代码相同的方式阅读它们?当你尝试时,是否收到某种错误消息? - jefflunt
3个回答

7

您需要配置Maven,将这些文件用作测试资源。

只需在pom.xml中指定即可。然后Maven将处理您的配置文件,就像处理测试资源一样。

  <build>
    ...
    <testResources>

      <!-- don't forget to specify the default test resources directory -->
      <testResource>
        <directory>src/test/resources</directory>
      </testResource>

      <!-- add the config directory -->
      <testResource>
        <directory>src/main/conf</directory>
      </testResource>

    </testResources>
    ...
  </build>

这个设置会强制Maven在运行单元测试之前将配置文件复制到target/tests-classes目录下。 然后你的单元测试就可以使用类路径上的配置文件,并且可以使用getClass().getResource("/yourConfigFile.conf")来读取它们。


将文件放在 src/main/resourcessrc/test/resources 中会简单得多。 - Christoffer Hammarström
我更喜欢我的方式。你可以更明确地表达资源的目的。并且它更简单,可以进行额外的配置,比如过滤。 - amra
@ChristofferHammarström,我发现surefire插件会阻止将src/test/resources下的文件复制到target/test-classes中。 - soMuchToLearnAndShare

2

补充Christoffer的答案,为了在测试中访问src/main/conf,您需要将该文件夹添加到maven-surefire-plugin类路径配置中:

<build>
    <plugins>
    .....   
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.9</version>
    <configuration>
      <additionalClasspathElements>
        <additionalClasspathElement>src/main/conf</additionalClasspathElement>           
      </additionalClasspathElements>
    </configuration>
  </plugin> 

您可以从类路径中加载文件。假设有一个文件位于 src/main/conf/test.txt:

this.getClass().getResourceAsStream("/test.txt")

为了在 Eclipse 中运行此代码,您还需要将该文件夹添加到构建路径中。

您可以在以下链接中找到更多信息:http://maven.apache.org/plugins/maven-surefire-plugin/examples/configuring-classpath.html


将文件放在 src/main/resourcessrc/test/resources 中会更加简单。 - Christoffer Hammarström
我同意,但这只是以防您需要在类路径中添加另一个文件夹的情况;可能是遗留问题或者您需要出于其他原因共享/访问生产配置中的文件夹。文档还不建议将自定义JAR /资源添加到类路径中。 - Fabio Kenji
1
对我来说比较难懂的是,在 this.getClass().getResourceAsStream("/test.txt") 中似乎需要加上 /。如果写成 this.getClass().getResourceAsStream("test.txt"),就无法正常工作。这一点起初并不是很明显。 - Patrick
@ChristofferHammarström,我发现surefire插件会阻止将src/test/resources下的文件复制到target/test-classes中。 - soMuchToLearnAndShare

2
你应该将这些文件放在 src/main/resources 目录下,这样它们就会被包含在类路径中,并通过 this.getClass().getResourceFromStream("...") 访问。
编辑:如 bbaja42 所说,如果这些文件只用于测试,则应放在 src/test/resources 目录下。

1
测试配置不应该放在 src/test/resources 目录下吗? - bbaja42
@bbaja42:他们肯定应该这样做,但我认为这些配置文件也被用于测试之外的地方。 - Christoffer Hammarström
他可以在pom中设置资源,以便测试内容也查找src/main/resources,避免资源的(可能冲突的)副本。 - Keith Layne
@keith.layne:this.getClass().getResourceFromStream("...")会在类路径上查找,测试中包含src/main/resourcessrc/test/resources。没有特殊的设置。 - Christoffer Hammarström

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接