本地单元测试:读取生产资源时的getResourceAsStream

时间:2018-02-16 18:15:47

标签: java android gradle junit android-studio-3.0

关于getResource或getResourceAsStream返回null有很多问题,到目前为止我理解这个问题但我目前无法正确解决它。

我有一个资源文件,供生产中的某些类使用。该文件位于

SomeManager

班级InputStream stream = SomeClass.class.getResourceAsStream("/res/raw/some.def");使用它来访问此文件:

getResourceAsStream

在模拟器上运行应用程序的调试变体时成功,并且在运行已检测测试的调试变量时也会成功。我假设因为资源已正确打包到jar中?

然而,当我在android studio中运行一些本地jUnit测试时,找不到此资源。我没有完全理解在运行本地测试时究竟执行了什么,我不知道如何以可以在测试中加载的方式提供资源文件。

我想避免将此资源文件加倍,因为它实际上是我要测试的内容,我也不想更改xData = myDataTable.AsEnumerable().Select(x => x.Field<double>("XData")).ToArray(); yData = myDataTable.AsEnumberable().Select(x => x.Field<double>("YDate")).ToArray(); 路径,因为这是生产文件我想测试。

如果重要的话,我正在使用gradle和android studio。

1 个答案:

答案 0 :(得分:0)

我使用Sysinternal的Process Monitor调试了这个问题,并意识到当我在我的机器上本地运行代码时,资源就是从磁盘上的各个不同位置查找流。其中一个地点是 显然缺少// verify connection configuration transporter.verify(function(error, success){ if (error) { console.log(error); } else { console.log('Ok message'); } });

解决方法是创建一个复制任务,执行复制并使其足够健壮,适用于所有构建类型。

所以我修改了应用程序的gradle文件并添加了那些动态任务:

<build_directory>/intermediate/classes/<build_type>

我真的不知道如何正确使用gradle,但第一个语句生成的copyDebugAssets_xxx任务与构建类型一样多。同步后,您可以在gradle项目中查看并执行它。

为避免在手动完成清理或重建时调用它们,第二部分将copyDebugAssets_xxx复制任务注册到各种android.buildTypes.all{ theBuildType -> task "copyDebugAssets_${theBuildType.name}"(type: Copy){ from "${projectDir}/src/main/res" into "${buildDir}/intermediates/classes/${theBuildType.name}/res" eachFile { println it.name } } } tasks.whenTaskAdded { task -> // println "A message which is logged at QUIET level ${task.name}" if (task.name.startsWith("process") && task.name.endsWith("Resources")) { def partInBetween = task.name.substring("process".length(), task.name.indexOf("Resources")).toLowerCase() if (partInBetween == "debugandroidtest") { return } def dependentTask = "copyDebugAssets_${partInBetween}" println "Registering ${dependentTask} to ${task.name} for config '${partInBetween}'" task.dependsOn dependentTask } } 任务,然后自动调用这些任务。到目前为止,我可以成功地在多种构建类型中运行本地单元测试。