对于我的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单元测试中读取仅测试文件相关推荐

  1. c语言c 下载文件,如何在C/C++中使用WinHTTP下载文件?

    我知道如何下载html / txt页面.例如 : //Variables DWORD dwSize = 0; DWORD dwDownloaded = 0; LPSTR pszOutBuffer; v ...

  2. python读文件缺key_在Python中读取Twitter json文件时出现KeyErrors

    我试图用我从twitter收集的数据分析一个json文件,但是当我试图搜索一个关键字时,它说找不到,但是我可以看到它在那里.我试了两种不同的方法.我会把它们贴在下面.任何建议都很好.在 尝试1:imp ...

  3. IDEA下,如何在java项目中新增jsp模板文件

    IDEA下,如何在java项目中新增jsp模板文件 大家会不会有这样的烦恼,就是当想要创建一个jsp模板文件的时候,右键new的时候找不到JSP选项. 这是因为在创建项目的时候没有选中Web Appl ...

  4. 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 ...

  5. C#中读取流媒体视频文件转H.264具体实现方法

    现在有越来越多的人在使用C#语言做编程,但我发现好像用C#做音视频流媒体开发的比较少.我们的libEasyScreenLive目前支持Windows,Android平台,通过EasyScreenLiv ...

  6. 如何在java代码中读取配置文件

    在日常开发过程中,我们经常需要拼接一些字符串之类的东西,而这些字符串往往是不变的,或者在java代码中多次使用到的.当然我们可以在java代码中写死,但是这样做的缺点也是有目共睹的,一旦业务需求发生变 ...

  7. sublime python3中读取和写入文件时如何解决编码问题

    sublime python3中读取和写入文件时如何解决编码问题 参考文章: (1)sublime python3中读取和写入文件时如何解决编码问题 (2)https://www.cnblogs.co ...

  8. 计算机目录读取,从项目目录中读取SQL查询文件(Read SQL query file from project directory)...

    从项目目录中读取SQL查询文件(Read SQL query file from project directory) 我在Visual Studio项目中放置了3个特别大的SQL查询,位于项目目录中 ...

  9. matlab 十六进制数组,【MATLAB】MATLAB中读取二进制数据文件并加入到矩阵中

    MATLAB中读取二进制数据文件并加入到矩阵中的应用如下: 如果对c语言十分熟悉的话,应该对fopen,fclose,ftell,fseek,fread,fwrite,feof 这些函数非常熟悉了,在 ...

最新文章

  1. python中execute函数_Python 中的内置函数与模块
  2. Qt 中容器类型的控件
  3. 计算机pc软盘不能数字,老人把遗嘱存5寸软盘难坏家人 老电脑终未读出
  4. 剖析Linux系统启动过程
  5. tcp_handle_req: Made 4 read attempts but message is not complete yet - closing connection
  6. xmind可以画流程图吗_新娘妆可以自己画吗?临夏化妆学校告诉你答案!
  7. java 连接远程服务器_java实现连接远程服务器并执行命令的基本原理
  8. docker之使用supervisor管理多个进程
  9. sql tempdb清理_SQL Server 2019中的内存优化的TempDB元数据
  10. 设计HTML标签title属性值换行
  11. 小米路由器mini实现锐捷认证.
  12. 阻滞增长模型求解_马尔萨斯与阻滞增长模型对于人口预测的分析
  13. 敏捷开发模式下的BA岗
  14. 绕过 office 宏密码保护
  15. 如何用代码实现发送qq邮件(详细代码)
  16. 采样点数、采样率、采样频率、平均采样次数
  17. 第一次JAVA作业(ZLY)
  18. JAVA高级应用课程设计(网上书城系统——会员登陆模块的设计与实现)
  19. php 使用内置web服务器
  20. 考研线性代数手写笔记1 行列式

热门文章

  1. 华为要升级的鸿蒙手机型号,华为鸿蒙首批升级机型名单出炉,快看看有你的手机型号吗?...
  2. ESP32学习-GPIO的使用与配置
  3. 架构师之路—理解设计模式
  4. w10的计算机服务在哪里,win10怎么打开系统服务
  5. android充值金币功能,运营人员必读:手机游戏充值流程及问题详解
  6. js获取浏览器body或窗宽度高度
  7. 图像传感器噪声建模与分析
  8. 机器学习与知识发现教材和参考答案
  9. information security
  10. 股票日回易略(附源码