我有一个需要使用位于 src/test/resources/abc.xml
中的 XML 文件的单元测试。将文件内容放入 String
的最简单方法是什么?
getResourceAsStream()
,我认为这是解决 OP 问题的正确方法。
多亏了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();
}
}
切中要害:
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("file/test.xml").getFile());
假设文件中的 UTF8 编码 - 如果不是,只需省略“UTF8”参数 & 将在每种情况下使用底层操作系统的默认字符集。
JSE 6 中的快速方法 - 简单且没有 3rd 方库!
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");
}
自 Java 9 以来的快速方法
new String(getClass().getClassLoader().getResourceAsStream(resourceName).readAllBytes());
不过,它们都不打算用于巨大的文件。
String xml = new String(java.nio.file.Files.readAllBytes(Paths.get(url.toURI())), "UTF8");
首先确保将 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 "";
}
}
your output directory
是什么?
apache.commons.io.*
类来读取文件,以及 java.lang.Class.getResource()
。你怎么看?
abc.xml
复制到输出目录? @KirkWoll
使用谷歌番石榴:
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)
您可以尝试这样做:
String myResource = IOUtils.toString(this.getClass().getResourceAsStream("yourfile.xml")).replace("\n","");
这是我用来获取带有文本的文本文件的内容。我使用了 commons 的 IOUtils 和 guava 的 Resources。
public static String getString(String path) throws IOException {
try (InputStream stream = Resources.getResource(path).openStream()) {
return IOUtils.toString(stream);
}
}
您可以使用 Junit Rule 为您的测试创建这个临时文件夹:
@Rule public TemporaryFolder temporaryFolder = new TemporaryFolder();
File file = temporaryFolder.newFile(".src/test/resources/abc.xml");
好的,对于JAVA 8,经过大量调试我发现两者之间存在差异
URL tenantPathURI = getClass().getResource("/test_directory/test_file.zip");
和
URL tenantPathURI = getClass().getResource("test_directory/test_file.zip");
是的,路径开头的 /
没有它我得到 null
!
test_directory
位于 test
目录下。
使用 Commons.IO,此方法可以从实例方法或静态方法中工作:
public static String loadTestFile(String fileName) {
File file = FileUtils.getFile("src", "test", "resources", fileName);
try {
return FileUtils.readFileToString(file, StandardCharsets.UTF_8);
} catch (IOException e) {
log.error("Error loading test file: " + fileName, e);
return StringUtils.EMPTY;
}
}
IOUtils.toString(this.getClass().getResource("foo.xml"), "UTF-8")
。IOUtils.toString
静态方法吗?根据您众所周知的static
不喜欢,您现在将如何解决它?