如何将文本文件资源读入Javaunit testing?
我有一个unit testing需要使用位于src/test/resources/abc.xml
XML文件。 什么是最简单的方法来获取文件的内容到String
?
最后,我find了一个很好的解决scheme,感谢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)。
如果用"/foo/test.xml"
replace"abc.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(); } }
假设在文件中使用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"); }
尽pipe如此,它们也不是用于大文件。
正确的点:
ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource("file/test.xml").getFile());
首先确保将abc.xml
复制到您的输出目录。 那么你应该使用getResourceAsStream()
:
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("test/resources/abc.xml");
一旦你有了InputStream,你只需要把它转换成一个string。 这个资源拼出来: 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 ""; } }
你可以尝试做:
String myResource = IOUtils.toString(this.getClass().getResourceAsStream("yourfile.xml")).replace("\n","");
这是我用来获取带有文本的文本文件。 我使用了commons的IOUtils和番石榴的资源。
public static String getString(String path) throws IOException { try (InputStream stream = Resources.getResource(path).openStream()) { return IOUtils.toString(stream); } }
随着谷歌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)
您可以使用Junit规则为您的testing创build此临时文件夹:
@Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); File file = temporaryFolder.newFile(".src/test/resources/abc.xml");