如何将文本文件资源读入Java单元测试?

How to read a text-file resource into Java unit test?

本问题已经有最佳答案,请猛点这里访问。

我有一个单元测试需要使用位于src/test/resources/abc.xml中的XML文件。把文件的内容放到String中最简单的方法是什么?


最后,我找到了一个简洁的解决方案,这要归功于ApacheCommons:

1
2
3
4
5
6
7
8
9
10
11
package com.example;
import org.apache.commons.io.IOUtils;
public class FooTest {
  @Test
  public void shouldWork() throws Exception {
    String xml = IOUtils.toString(
      this.getClass().getResourceAsStream("abc.xml"),
     "UTF-8"
    );
  }
}

工作得很好。文件src/test/resources/com/example/abc.xml已加载(我正在使用maven)。

如果将"abc.xml"替换为,例如,"/foo/test.xml",则将加载此资源:src/test/resources/foo/test.xml

你也可以使用仙人掌:

1
2
3
4
5
6
7
8
9
10
11
package com.example;
import org.cactoos.io.ResourceOf;
import org.cactoos.io.TextOf;
public class FooTest {
  @Test
  public void shouldWork() throws Exception {
    String xml = new TextOf(
      new ResourceOf("/com/example/abc.xml") // absolute path always!
    ).asString();
  }
}


直截了当地说:

1
2
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("file/test.xml").getFile());


假设文件中有UTF8编码-如果没有,只需去掉"utf8"参数&;将使用每种情况下底层操作系统的默认字符集。

JSE 6中的快速方法-简单&无第三方库!

1
2
3
4
5
6
7
8
import java.io.File;
public class FooTest {
  @Test public void readXMLToString() throws Exception {
        java.net.URL url = MyClass.class.getResource("test/resources/abc.xml");
        //Z means:"The end of the input but for the final terminator, if any"
        String xml = new java.util.Scanner(new File(url.toURI()),"UTF8").useDelimiter("\\Z").next();
  }
}

JSE 7中的快速方法(未来)

1
2
3
4
5
6
public class FooTest {
  @Test public void readXMLToString() throws Exception {
        java.net.URL url = MyClass.class.getResource("test/resources/abc.xml");
        java.nio.file.Path resPath = java.nio.file.Paths.get(url.toURI());
        String xml = new String(java.nio.file.Files.readAllBytes(resPath),"UTF8");
  }

不过,这两个都不打算放大量的文件。


首先确保将abc.xml复制到输出目录。那么您应该使用getResourceAsStream()

1
2
InputStream inputStream =
    Thread.currentThread().getContextClassLoader().getResourceAsStream("test/resources/abc.xml");

一旦有了inputstream,就只需要将其转换为字符串。这个资源说明了这一点:http://www.kodejava.org/examples/266.html。不过,我将摘录相关代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public String convertStreamToString(InputStream is) throws IOException {
    if (is != null) {
        Writer writer = new StringWriter();

        char[] buffer = new char[1024];
        try {
            Reader reader = new BufferedReader(
                    new InputStreamReader(is,"UTF-8"));
            int n;
            while ((n = reader.read(buffer)) != -1) {
                writer.write(buffer, 0, n);
            }
        } finally {
            is.close();
        }
        return writer.toString();
    } else {        
        return"";
    }
}


使用google guava:

1
2
3
4
5
6
7
8
9
10
import com.google.common.base.Charsets;
import com.google.common.io.Resources;

public String readResource(final String fileName, Charset charset) throws Exception {
        try {
            return Resources.toString(Resources.getResource(fileName), charset);
        } catch (IOException e) {
            throw new IllegalArgumentException(e);
        }
}

例子:

1
String fixture = this.readResource("filename.txt", Charsets.UTF_8)

您可以尝试执行以下操作:

1
2
String myResource = IOUtils.toString(this.getClass().getResourceAsStream("yourfile.xml")).replace("
"
,"");


可以使用JUnit规则为测试创建此临时文件夹:

@Rule public TemporaryFolder temporaryFolder = new TemporaryFolder();
File file = temporaryFolder.newFile(".src/test/resources/abc.xml");


下面是我用来获取文本文件的内容。我使用了公共资源的ioutils和guava的资源。

1
2
3
4
5
public static String getString(String path) throws IOException {
    try (InputStream stream = Resources.getResource(path).openStream()) {
        return IOUtils.toString(stream);
    }
}