关于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。
答案 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
}
}
任务,然后自动调用这些任务。到目前为止,我可以成功地在多种构建类型中运行本地单元测试。