Android单元测试读写文件,如何在Android单元测试中读取仅测试文件

article/2025/10/9 8:19:54

对于我的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中。

a904d79c2b08912e999baaa1468af924.png

然后,您可以像这样进入文本文件:

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();


http://chatgpt.dhexx.cn/article/sMWrtwPT.shtml

相关文章

安卓项目如何做单元测试

前言 先说一下创建篇文章的目的,近期负责搭建公司的单元测试框架,于是查阅了网上的很多文章,以及参考了github上很多的项目例子,并且也进行了相当多的尝试。这其中花费了很多的精力,大约有两三周的时间,远…

android单元测试作用,关于 Android 单元测试

本文不会用各种高大上的理由试图去说服你写单元测试,只是描述笔者在单元测试这条路上一路走来的思考和简单的示例,如果顺便能让你觉得单元测试其实也没那么遥远、回头也在实际项目中尝试一下,估计就是本文最大的收获了。 一、提起单元测试&am…

分享基于安卓项目的单元测试总结

前言: 负责公司的单元测试体系的搭建,大约有一两个月的时间了,从最初的框架的调研,到中期全员的培训,以及后期对几十个项目单元测试的引入和推进,也算是对安卓的单元测试有了一些初步的收获以及一些新的认…

java 线程 js_js javascript 实现多线程

在讲之前,大家都知道js是基于单线程的,而这个线程就是浏览器的js引擎。 首先来看一下大家用的浏览器都具有那些线程吧。 假如我们要执行一些耗时的操作,比如加载一张很大的图片,我们可能需要一个进度条来让用户进行等待&#xff0…

js创建多线程

我们知道js是单线程的,如果把占用大量计算资源的代码,或者获取大量数据,耗时较多的请求分离出去,用一个单独的线程去处理,会不会提升页面的性能的,答案是肯定的,尤其是现在我们开发大多是单页应…

javascript-js实现多线程

在讲之前,大家都知道js是基于单线程的,而这个线程就是浏览器的js引擎。 首先来看一下大家用的浏览器都具有那些线程吧。 假如我们要执行一些耗时的操作,比如加载一张很大的图片,我们可能需要一个进度条来让用户进行等待&#xff…

html5多线程例子,javascript的单线程事件循环及多线程介绍

前言 其实我前面文章对于改变js的执行顺序及多线程都有相关介绍!例如,我们可以用setTimeout(fn,0)改变代码执行循序,文章最后也提及了Event Loop(事件循环)。同时,js的Worker可以模拟实现多线程,我前面文章也有类似的应…

js 实现多线程

2019独角兽企业重金招聘Python工程师标准>>> 一、多线程理解 首先,我们要理解什么是多线程,百度百科上说:多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线…

javascript多线程

一、什么是多线程 二、Concurrent.Thread.js <meta charset"utf-8" /> <script src"Concurrent.Thread.js"></script> <script src"https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><style&…

js 多线程Worker

任务执行优先级&#xff0c;微任务&#xff08;Promise&#xff09;>宏任务&#xff08;定时器&#xff09;>线程任务&#xff08;Worker&#xff09; 多线程处理多个任务&#xff0c;这里假设5个任务循环了80亿&#xff0c;如果按之前js单线程执行是不是5*80亿&#xf…

Javascript的单线程与多线程

目录 一、浏览器的线程和进程 1.浏览器的线程 2.浏览器是多进程的 二、Javascript是单线程的 1.异步Ajax也是单线程的 2.setInterval和setTimeout本质上并不是多线程 三、Web Worker支持多线程 1.多线程间数据交互 2.Web Worker的兼容性 3.Web Worker的使用限制 3.1同…

JavaScript多线程编程

浏览器端JavaScript是以单线程的方式执行的&#xff0c;也就是说JavaScript和UI渲染占用同一个主线程&#xff0c;那就意味着&#xff0c;如果JavaScript进行高负载的数据处理&#xff0c;UI渲染就很有可能被阻断&#xff0c;浏览器就会出现卡顿&#xff0c;降低了用户体验。 …

JavaScript多线程初步学习

一、多线程理解 首先&#xff0c;我们要理解什么是多线程&#xff0c;百度百科上说&#xff1a;多线程&#xff08;英语&#xff1a;multithreading&#xff09;&#xff0c;是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时…

JavaScript如何实现多线程?

今天看到一道面试题&#xff0c;问js如何实现多线程?下面来总结一下&#xff1a; 因为 JS是一种单线程语言&#xff0c;即使是一些异步的事件也是在JS的主线程上运行的。像setTimeout、ajax的异步请求&#xff0c;或者是dom元素的一些事件&#xff0c;都是在JS主线程执行的&a…

JS多线程

JS是多线程的吗&#xff1f; 多线程编程相信大家都很熟悉&#xff0c;比如在界面开发中&#xff0c;如果一个事件的响应需要较长时间&#xff0c;那么一般做法就是把事件处理程序写在另外一个线程中&#xff0c;在处理过程中&#xff0c;在界面上面显示类似进度条的元素。这样…

at24c16如何划分出多个读写区_mega32数组、内存以及AT24C16读写相关

主控&#xff1a;mega32 编译器&#xff1a;iar2.31E 这两天折腾一个模块程序&#xff0c;一个温度补偿参数&#xff0c;本来是72个字节&#xff0c;现在扩展了三倍&#xff0c;变成288个&#xff0c;然后各种问题出现了。 第一次修改时想当然&#xff0c;直接把两个用到的全局…

STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储

目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解)STC8H开发(三): 基于FwLib_STC8的模数转换ADC介绍和演示用例说明STC8H开发(四): FwLib_STC8 封装库的介绍和使用注意事项STC8H开发(五…

STM32的硬件I2C与AT24C16

刚学STM32的时候就听闻STM32的硬件I2C存在重大bug&#xff0c;会导致运行卡死在等待ACK的过程中&#xff0c;所以一直以来对其避而远之&#xff0c;转而以模拟I2C取代之。最近这段时间一直在用STM32 CubeMX&#xff0c;图形化设置界面屡试不爽&#xff0c;连USB这种复杂外设都能…

STM32F030 硬件I2C驱动 AT24C16

网络上很多F1系列的ATC24的读写程序&#xff0c;但F0几乎没有。由于F0完全重写了I2C&#xff0c;所以以往的代码并不能直接使用&#xff0c;修改事件、接口上会浪费很多时间&#xff0c;特别是对于使用F0系列进行入门的新手。 在此十分感谢 畅学电子网 的对于AT24C16的资料&am…

EEPROM 之 AT24C16 - 备忘录

因为论坛里看到STM的I2C有点小bug&#xff0c;所以这里采用的是模拟I2C时序 【注】m0.6us表示的是这一段时间最小不能小于为0.6us&#xff0c;M0.6us表示的是这一段时间最大为0.6us 对AT24C16的操作有读和写&#xff0c;读又分为CURRENT ADDRESS READ、RANDOM READ、SEQUENTIAL…