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

时间:2010-10-08 14:07:45

标签: java unit-testing

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

8 个答案:

答案 0 :(得分:187)

最后,我找到了一个简洁的解决方案,感谢Apache Commons

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

您还可以使用Cactoos

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 :(得分:91)

关键点:

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

答案 2 :(得分:51)

假设UTF8编码在文件中 - 如果没有,只要省略“UTF8”参数&将使用 每种情况下底层操作系统的默认字符集。

JSE 6中的快捷方式 - 简单&没有第三方图书馆!

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(未来)的快速方式

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"); 
  }

但两者都没有用于大量文件。

答案 3 :(得分:13)

首先确保将abc.xml复制到输出目录。然后你应该使用getResourceAsStream()

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

拥有InputStream后,只需将其转换为字符串即可。该资源说明了这一点:http://www.kodejava.org/examples/266.html。但是,我会摘录相关代码:

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 "";
    }
}

答案 4 :(得分:7)

使用Google Guava:

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);
        }
}

示例:

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

答案 5 :(得分:5)

您可以尝试:

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

答案 6 :(得分:1)

这是我以前用文本获取文本文件的内容。我用过公共场所' IOUtils和番石榴的资源。

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

答案 7 :(得分:1)

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

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