Android单元测试读写文件,如何在Android单元测试中读取仅测试文件
对于我的Android应用程序,我正在编写需要读取一些文件的单元测试。 由于这些是仅测试文件,因此我不希望它们出现在res文件夹中,因为我不希望它们最终出现在最终的.apk文件中。
我想做与此问题类似的事情,但要使用新添加的(在Gradle 1.1中)单元测试支持(而不是仪器测试)。
我的项目结构如下:
/app
/src
/main
/java/my.module/myClass.java
/res/production_resources_go_here
/test
/java/my.module/myClassTest.java
/resources/testFile.txt
我的myClassTest测试应该如何才能成功读取testFile.txt?
我认为我们需要查看更多代码供myClass.java对此发表评论。 您想让测试将testFile.txt传递给处理myClass中文本文件的任何方法,然后检查(用AssertJ声明)结果是否按预期返回。 研究Robolectric和Mockito可能会给您一些想法。
myClass.java无关紧要。 假设它有一个消耗InputStream的方法,并且我希望流在测试中包含文件中的内容。 那有意义吗?
如果您想对此进行一些修改,请阅读"我的帖子"。 您可以在手机内打开apk,然后将其读取为流
在问这个问题的时候,这根本行不通。幸运的是,此后已解决。
OP必须尝试将文本文件放在app/src/test/resources文件夹下。此外,它必须与您的测试班级放在同一包中。因此,如果您在app/src/test/java文件夹中的com.example.test软件包中包含ReadFileTest.java,则您的测试文件应位于app/src/test/resources/com/example/test中。
然后,您可以像这样进入文本文件:
getClass().getResourceAsStream("testFile.txt")
这将打开文本文件的InputStream。如果不确定如何处理它,可以使用以下几种方法:将InputStream读取/转换为String
FWIW我认为现在可以正常工作了。 如果有兴趣,我可以仔细检查并编辑答案以显示如何加载文件。
是的,我有兴趣,请示范。
如果可以的话,我会投票100次。 关键实际上是正确的道路。 谢谢谢谢! :D
如果某人在使InputStream结果为null时遇到问题,请添加斜杠,例如getClass().getResourceAsStream(;quot;;#47;testFile.txt;quot;)。
对于那些为输入流留有null的用户的另一个提示,请确保在创建资源的目录路径(例如com.example.test)时不要添加点。 当使用点而不是资源目录创建时,Android Studio将在java文件夹内自动创建目录
将此添加到您的build.gradle中:
android {
sourceSets {
test {
resources.srcDirs += ['src/test/resources']
}
androidTest {
resources.srcDirs += ['src/androidTest/resources']
}
}
}
为了使单元测试可以访问资源,请在以下位置添加文件:src/test/resources。
对于仪器测试,将文件添加到:src/androidTest/resources。
紧跟@Deepansu的答案,我统一了{project root}/sampledata目录中的测试数据,该目录是Android Studio Newp;gt; Sample Data Directory命令的默认位置。
1.在您的项目中,右键单击并单击Newp;gt; Sample Data Directory。这将在app中创建sampledata目录,该目录与build.gradle文件,src和build目录具有相同的层次结构。
2.在build.gradle中,添加如下脚本;
android {
sourceSets {
test {
resources.srcDirs += ['sampledata']
}
androidTest {
resources.srcDirs += ['sampledata']
}
}
}
3. gradle中的Sync。
现在,我们可以将测试资源文件放在一个目录中,并在两个测试环境中使用它们。
您可以阅读以下文件;
// use somewhere at test logic. Note that slash symbol is required (or not).
jsonObject = new JSONObject(readFromFile("/testFile.json"));
// a method to read text file.
public String readFromFile(String filename) throws IOException {
InputStream is = getClass().getResourceAsStream(filename);
StringBuilder stringBuilder = new StringBuilder();
int i;
byte[] b = new byte[4096];
while ((i = is.read(b)) != -1) {
stringBuilder.append(new String(b, 0, i));
}
return stringBuilder.toString();
}
这有效,而且超级简单。 谢谢
我正在一个结构类似于您提到的项目。
我将所有服务器响应都放在resources文件夹(如app/src/test/resources/BookingInfo.json)下的文件中。
所有Java测试文件都在app/src/test/java/PACKAGE_NAME下,与您所说的相似。我在包含资源名称的包下有一个Fixture类:
@SuppressWarnings("nls")
public final class Fixtures
{
public static final String GET_ANNOUNCEMENT ="GetAnnouncement.json";
...
}
最后是一个FixtureUtils类,该类的方法负责读取资源文件并返回结果。
import java.nio.file.Files;
import java.nio.file.Paths;
public class FixtureUtils
{
public static final AFixture fixtureFromName(final String fixtureName)
{
final String fixtureString = FixtureUtils.stringFromAsset(fixtureName);
if (StringUtils.isEmpty(fixtureString))
{
return null;
}
final Gson gson = new Gson();
final AFixture aFixture = gson.fromJson(fixtureString, AFixture.class);
return aFixture;
}
private static final String stringFromAsset(final String filename)
{
try
{
final URL resourceURL = ClassLoader.getSystemResource(filename);
if (resourceURL == null)
{
return null;
}
final String result = new String(Files.readAllBytes(Paths.get(resourceURL.toURI())),
Charset.forName("UTF-8")); //$NON-NLS-1$
return result;
}
catch (final Exception e)
{
e.printStackTrace();
}
return null;
}
private FixtureUtils()
{
// Ensure Singleton
}
}
AFixture类看起来像:
public class AFixture
{
public List validItems;
public List invalidItems;
public AFixture()
{
super();
}
public List getInvalidItems()
{
return this.invalidItems;
}
public List getValidItems()
{
return this.validItems;
}
public void setInvalidItems(final List invalidItems)
{
this.invalidItems = invalidItems;
}
public void setValidItems(final List validItems)
{
this.validItems = validItems;
}
}
注意:如果我没有记错的话,java.nio.file已从JDK8中删除,但是如果您使用的是JDK7,则没有问题。如果您使用的是JDK8,则只需以FileInputStream(旧时尚样式)或Scanner之类的方式更改stringFromAsset方法。
正确方法的一个示例是将文件放在资产文件夹中。但是,资产文件夹的内容将添加到apk中。
InputStream is = resources.getAssets().open("test.txt");
您可以欺骗该系统并遍历项目中的任何其他文件。确保在项目的iml文件中指定的位置(例如src / main / assets)中创建资产目录。
InputStream is = resources.getAssets().open("../../test/resources/testFile.txt");
获取资源的方法的一个示例是:
Resources resources = new Activity().getResources();
Android单元测试读写文件,如何在Android单元测试中读取仅测试文件相关推荐
- c语言c 下载文件,如何在C/C++中使用WinHTTP下载文件?
我知道如何下载html / txt页面.例如 : //Variables DWORD dwSize = 0; DWORD dwDownloaded = 0; LPSTR pszOutBuffer; v ...
- python读文件缺key_在Python中读取Twitter json文件时出现KeyErrors
我试图用我从twitter收集的数据分析一个json文件,但是当我试图搜索一个关键字时,它说找不到,但是我可以看到它在那里.我试了两种不同的方法.我会把它们贴在下面.任何建议都很好.在 尝试1:imp ...
- IDEA下,如何在java项目中新增jsp模板文件
IDEA下,如何在java项目中新增jsp模板文件 大家会不会有这样的烦恼,就是当想要创建一个jsp模板文件的时候,右键new的时候找不到JSP选项. 这是因为在创建项目的时候没有选中Web Appl ...
- bak文件转oracle文件,如何在Oracle 11g中恢复.bak文件(How to restore .bak file in oracle 11g)...
如何在Oracle 11g中恢复.bak文件(How to restore .bak file in oracle 11g) 我有Oracle 11g备份文件(.bak文件)如何在Oracle 11g ...
- C#中读取流媒体视频文件转H.264具体实现方法
现在有越来越多的人在使用C#语言做编程,但我发现好像用C#做音视频流媒体开发的比较少.我们的libEasyScreenLive目前支持Windows,Android平台,通过EasyScreenLiv ...
- 如何在java代码中读取配置文件
在日常开发过程中,我们经常需要拼接一些字符串之类的东西,而这些字符串往往是不变的,或者在java代码中多次使用到的.当然我们可以在java代码中写死,但是这样做的缺点也是有目共睹的,一旦业务需求发生变 ...
- sublime python3中读取和写入文件时如何解决编码问题
sublime python3中读取和写入文件时如何解决编码问题 参考文章: (1)sublime python3中读取和写入文件时如何解决编码问题 (2)https://www.cnblogs.co ...
- 计算机目录读取,从项目目录中读取SQL查询文件(Read SQL query file from project directory)...
从项目目录中读取SQL查询文件(Read SQL query file from project directory) 我在Visual Studio项目中放置了3个特别大的SQL查询,位于项目目录中 ...
- matlab 十六进制数组,【MATLAB】MATLAB中读取二进制数据文件并加入到矩阵中
MATLAB中读取二进制数据文件并加入到矩阵中的应用如下: 如果对c语言十分熟悉的话,应该对fopen,fclose,ftell,fseek,fread,fwrite,feof 这些函数非常熟悉了,在 ...
最新文章
- python中execute函数_Python 中的内置函数与模块
- Qt 中容器类型的控件
- 计算机pc软盘不能数字,老人把遗嘱存5寸软盘难坏家人 老电脑终未读出
- 剖析Linux系统启动过程
- tcp_handle_req: Made 4 read attempts but message is not complete yet - closing connection
- xmind可以画流程图吗_新娘妆可以自己画吗?临夏化妆学校告诉你答案!
- java 连接远程服务器_java实现连接远程服务器并执行命令的基本原理
- docker之使用supervisor管理多个进程
- sql tempdb清理_SQL Server 2019中的内存优化的TempDB元数据
- 设计HTML标签title属性值换行
- 小米路由器mini实现锐捷认证.
- 阻滞增长模型求解_马尔萨斯与阻滞增长模型对于人口预测的分析
- 敏捷开发模式下的BA岗
- 绕过 office 宏密码保护
- 如何用代码实现发送qq邮件(详细代码)
- 采样点数、采样率、采样频率、平均采样次数
- 第一次JAVA作业(ZLY)
- JAVA高级应用课程设计(网上书城系统——会员登陆模块的设计与实现)
- php 使用内置web服务器
- 考研线性代数手写笔记1 行列式