问题描述
我正在使用 Flank/Firebase 测试实验室编写在 Android Pixel API28 上运行的 JUnit4 测试,并尝试将一些元数据写入测试设备的任何公共 /sdcard/*
文件夹并下载元数据以进行进一步处理。>
此时我已经尝试了以下代码的多种变体,但似乎都没有奏效:
// val folder = "/storage/emulated/0/Download"
// val folder = "/sdcard/Android/Download"
val folder = getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS).absolutePath
val fileName = "$folder/Result-$testCaseId.json"
try {
val myObj = File(fileName)
if (myObj.createNewFile()) {
Log.i("MetadataListener","File created: " + myObj.getName())
} else {
Log.i("MetadataListener","File already exists.")
}
} catch (e: IOException) {
// println("An error occurred.")
Log.e("MetadataListener","Error message" + e.message)
e.printstacktrace()
}
我还尝试在我的 AndroidManifest.xml
中启用写入权限,但这没有任何作用。我也不认为我应该需要这些权限,因为我正在尝试写入公共下载文件夹:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
有人知道这里出了什么问题吗? 当我针对本地设备进行调试并逐步执行代码时,此代码确实可以正常运行。 :(
在这里非常感谢您的任何建议,谢谢!
解决方法
我在解决这个问题的过程中学到的东西:
-
默认情况下,Flank 提供所有权限,因此对于 Flank/Firebase 测试实验室配置,无需显式启用写入权限。这不是我的问题。
-
根本原因是这段代码实际上没有运行。事实证明,在我的 Gradle 插件代码中向测试运行程序注册侦听器时,Firebase 测试实验室不接受我的配置参数:
project.configure<LibraryExtension> {
defaultConfig.testInstrumentationRunner = "com.mypackage.TestRunner"
defaultConfig.testInstrumentationRunnerArgument("listener","com.mypackage.MetadataListener)
}
解决我的问题的变通方法和公认的答案是在运行时向我的测试运行器显式添加一个侦听器,而不是在构建时:
class TestRunner : AndroidJUnitRunner() {
override fun onCreate(arguments: Bundle) {
arguments.putString("listener",MetadataListener::class.java.name)
super.onCreate(arguments)
}
}