gpt4 book ai didi

java - 本地单元测试:读取生产资源时,getResourceAsStream

转载 作者:行者123 更新时间:2023-12-03 05:48:43 25 4
gpt4 key购买 nike

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

我有一个资源文件,供生产中的某些类使用。该文件位于
app\src\main\res\raw\some.defSomeManager类使用此文件来访问此文件:
InputStream stream = SomeClass.class.getResourceAsStream("/res/raw/some.def");
当在模拟器上运行应用程序的调试版本时,此操作成功;当运行已测试的调试版本时,此操作也成功。我认为是因为资源已正确包装到jar中了?

但是,当我在android studio中运行一些本地jUnit测试时,找不到此资源。我不完全了解运行本地测试时将执行什么操作,并且不确定如何以可以在测试中加载的方式提供资源文件。

我想避免将此资源文件加倍,因为它实际上是我要测试的东西,我也不想更改getResourceAsStream路径,因为这是我要测试的生产文件。

如果这很重要,我正在使用gradle和android studio。

最佳答案

我使用Sysinternal的Process Monitor调试了此问题,并意识到当我在计算机上本地运行代码时,资源就如同从磁盘上的各个不同位置查找流一样。这些位置之一是<build_directory>/intermediate/classes/<build_type>明显缺少的地方。

解决此问题的方法是创建一个复制任务,该任务执行复制并使其足够健壮以适合所有构建类型。

因此,我修改了应用程序的gradle文件并添加了这些动态任务:

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
}

}

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

为了避免每次手动执行清理或重建操作时调用它们,第二部分将copyDebugAssets_xxx复制任务注册到各种 process<Configuration>Resources任务中,然后自动调用它们。到目前为止,我可以成功地以多种构建类型运行本地单元测试。

关于java - 本地单元测试:读取生产资源时,getResourceAsStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48832694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com