java单元测试读文件数据_如何将文本文件资源读入Java单元测试?
本问题已经有最佳答案,请猛点这里访问。
我有一个单元测试需要使用位于src/test/resources/abc.xml中的XML文件。把文件的内容放到String中最简单的方法是什么?
另外,stackoverflow.com/questions/1656797/…
@尼基塔,尽管我的回答是肯定的,但这些问题并没有提到我认为是正确解决OP问题的方法的getResourceAsStream()。
@kirk,getresourceasstream将文件缓存在类加载器中。这是不必要的。
@Thorbj&248;rn,你的参考资料在哪里?在任何情况下,它肯定是方便和便携的,这实际上是必要的。
有关Android Studio,请参阅以下链接stackoverflow.com/a/33057561/3256989
耶戈尔256的回答不起作用。我的情况是getClass().getClassLoader().getResource("com/example/ninja.txt"));,我的资源文件位于com/example/ninja.txt。
最后,我找到了一个简洁的解决方案,这要归功于ApacheCommons:
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。
你也可以使用仙人掌:
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();
}
}
可以简单地做到这一点,而不需要外部的库依赖。
在这种情况下,我们应该关闭inputstream吗?
@DBF好问题…我认为我们应该这样做,但是因为这是一个单元测试,我们并不真正关心:)
您存储"abc.xml"的路径是什么?
@Bennyneugebauer查看答案的更新
@是的,256因为它是一个单元测试关闭资源特别重要。"单元测试应该是快速且独立的,让资源在测试运行期间保持开放状态,这意味着您的测试运行速度最好较慢,最坏的情况是以难以诊断的方式失败。
同样紧凑,但适当关闭输入流:IOUtils.toString(this.getClass().getResource("foo.xml"), "UTF-8")。
嘿@yegor256,不是IOUtils.toString静态方法吗?你现在怎么解决这个问题呢,根据你所熟知的"不喜欢"的说法?
@ RadekPosto?我无论如何也不能解决它,因为我从Apache得到的只是这个静态方法。如果他们能提供,比如FileAsString类,那就太好了,用哪个构造函数代替这个静态方法
以防getClass().getResourceAsstream()给出空指针。尝试从thread.currentThread().getContextClassLoader().getResourceas‌&8203;stream….
只有当文件位于同一个包中时,此操作才有效。如果它们不在同一个包里呢
@ RadekPosto?要解决我创建cactoos的问题,请参阅更新后的答案:)
我必须使用绝对路径,否则getResource()会返回null。所以这对我来说是正确的:this.getClass().getResource("/my-test-file.txt")。
这对我来说很有用。
直截了当地说:
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("file/test.xml").getFile());
在使用JUnit测试时为我工作,并希望通过将XLS文件加载到byte[]格式来设置测试。
这应该是被接受的答案->WorkforMeonSpringBoot刚刚在resources文件夹后面添加了路径。
这绝对是正确的答案。
按预期工作。未使用外部库。
OP询问"什么是将文件内容转换成字符串最简单的方法?"如果直接回答这个问题,这个答案会更好。
getClass().getClassLoader().getResource("test.xml");
file file=new file(getclass().getresource("/responses/example.json").getfi‌&8203;le())在没有getclassloader()的情况下也可以正常工作。
假设文件中有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");
}
不过,这两个都不打算放大量的文件。
第二个示例不起作用,readallbytes似乎不接受url…我最能让它工作的是String xml = new String(java.nio.file.Files.readAllBytes(Paths.get(url.toURI())),"UTF8");。
它确实有效-需要一个path类型的参数。所以我叫它呼吸。:)
哦,对了:)哦
我错过什么了吗?创建变量url而不使用它,使用变量resPath而不创建它。似乎很重要的一点是要包括让它发挥作用的魔法。
Oop。已修复-已添加缺少的行。现在我明白了之前在评论中的困惑:-$
@格伦贝斯特-你能解释一下"巨大的档案"是什么吗?
上面将文件内容直接读取到内存中的字符串中。因此,例如,如果您有4GB的内存,那么一个介于1-4GB之间的文件可能会被归类为"巨大的",因为它将消耗大量的内存资源(除了页面交换到磁盘)。对于大文件,最好以块形式进行流式读取,而不是同时进行。
java7版本是完美的,提示:使用standardcharsets.utf_8来避免不受支持的编码异常
你能解释一下为什么你要使用MyClass而不是FoTest,以及什么时候你想使用哪个类吗?
在示例中添加完整的包名称做得很好。这总是有帮助的。
我用文件名MyClass.class.getResource("/test/resources/abc.xml")开头的斜线
首先确保将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?
@文森佐,通常是"班",也许是"宾"。也就是说,无论你在哪里编译你的类。大多数IDE已经将资源文件(如XML文件)复制到该目录,所以您可能需要快速达到峰值,看看它是否已经存在。
在您的案例中似乎有太多的代码。我最好用一些apache.commons.io.*类来读取文件,用java.lang.Class.getResource()类。你怎么认为?
测试它的一个好方法是,将测试用例写在一个testkey=value的".properties"文件中,然后直接加载inputstream。示例:properties properties=new properties();properties.load(inputstream);string testcase=properties.getproperty("testkey");
如何将abc.xml复制到输出目录?@ KirkWoll
使用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)
您可以尝试执行以下操作:
String myResource = IOUtils.toString(this.getClass().getResourceAsStream("yourfile.xml")).replace("
","");
你为什么要拆掉新品?
@祖杜兹,对不起,我不记得了,这是两年前的事了
ioutils.toString toString(stream)也不推荐使用。需要在ioutils.toString toString(stream,charsets.utf_8)中传递字符集(import com.google.common.base.charsets;)
可以使用JUnit规则为测试创建此临时文件夹:
@Rule public TemporaryFolder temporaryFolder = new TemporaryFolder();
File file = temporaryFolder.newFile(".src/test/resources/abc.xml");
下面是我用来获取文本文件的内容。我使用了公共资源的ioutils和guava的资源。
public static String getString(String path) throws IOException {
try (InputStream stream = Resources.getResource(path).openStream()) {
return IOUtils.toString(stream);
}
}
java单元测试读文件数据_如何将文本文件资源读入Java单元测试?相关推荐
- java获取vdx文件数据_通过文件名获取文件类型ContentType
第一种方法: 引用System.Web.dll v4.5,就可以通过var mimeType = MimeMapping.GetMimeMapping(fileName);直接获取文件类型 第二种方法 ...
- java读取rvt文件数据_在不打开Rvt文件情况下读取rvt 里的信息
https://blog.csdn.net/The_Eyes/article/details/52328305 在Revit中插件中可以在后台打开rvt文件,并且访问他的数据,但是这个数据读取时依赖于 ...
- java 判断zip文件编码_如何使用UTF-8编码打开java程序生成的zip文件
我们的产品有一个导出功能,它使用ZipOutputStream压缩目录;但是,当您尝试压缩包含具有中文或日文字符的文件名的目录时,导出将无法正常工作.由于某种原因,压缩文件中的新文件的命名方式不同.以 ...
- python 读文件数据并画图
python 读文件数据并画图代码如下: import pandas as pd import matplotlib.pyplot as plt import re import os import ...
- java io 读文件
java io 读文件 /** * 读取文件 * @param fileName 文件名称 */ private void readFile(String fil ...
- spring批量写入mysql数据库_快速使用组件-spring batch(3)读文件数据到数据库
tags: springbatch 1.引言 上一篇文章<快速了解组件-spring batch(2)之helloworld>对Spring Batch进行了入门级的开发,也对基本的组件有 ...
- java爬取网页数据_利用Python做数据分析—对前程无忧数据类岗位进行分析
引言 随着时代的发展,我国在各行各业都需要大量的人才引进,处于近几年最热门的行业也称"最火行业":大数据.数据分析.数据挖掘.机器学习.人工智能,这五门行业各有不同又互有穿插.近几 ...
- java 更改excel文件名称_根据Excel文件中的内容,修改指定文件夹下的文件名称
问题:根据Excel文件中内容,把文件名称由第2列,改为第1列.比如:把文件"123.jpg"修改为"1.jpg". aaarticlea/png;base64 ...
- java导出csv文件乱码_记一次java生成csv文件乱码的解决过程 (GB2312编码)
系统:win7 (格式:中文(简体,中国)) 工具:Eclipse (默认编码utf-8) 服务两个:[restful接口] 和 [服务*** server]. 场景:[服务*** server]多 ...
最新文章
- 皮一皮:直男相亲还想着龙珠...
- leetcode算法题--分裂二叉树的最大乘积
- 【C++】38.类成员变量声明为 对象与指针的区别
- makefile多目录的.c 格式.cpp混合编译
- 算术运算符_加号的多种用法
- SAP Hybris Commerce,CRM和C4C的登录语言选择
- java 课后习题 找零钱
- 《X战警:黑凤凰》国内票房破2亿 口碑却落了《复联4》一大截
- idea占用cpu过高_生产环境服务器变慢、CPU占用过高,诊断思路和性能评估谈谈?...
- web和python前景_我想了解一下pythonweb和javaweb比较详细的学习成本和应用前景,谢谢!?...
- mysql 查询语法基础_入门MySQL——查询语法练习
- 计算机无法打印图片,Win7电脑连接打印机可以打印文档不能打印图片怎么办
- 华为机试:VLAN资源池
- 跨期套利的四大核心逻辑
- mysql 木马_通过mysql写入一句话木马
- 微信小程序软键盘回车事件
- Neo4j-简单使用
- 力扣 P 344 反转字符串
- FORESEE G500发布,江波龙国产固态硬盘再发声
- 字典序及1-n之间的数按字典序排列