android - getExternalFilesDir(null) 在 Espresso 测试中返回 null
问题描述
我试图getExternalFilesDir(null)
在执行@BeforeClass
方法期间从 Espresso 测试访问以在开始测试之前设置一些应用程序文件。
我正在尝试像这样访问它:
InstrumentationRegistry.getInstrumentation().context.getExternalFilesDir(null)
Environment.getExternalStorageState()
"mounted"
return ,但在上面的调用中返回getExternalFilesDir(null)
null ,这与文档中声明它仅在未安装存储时才返回 null 相反。
有趣的是,InstrumentationRegistry.getInstrumentation().context.filesDir
它确实返回了一个值,但它返回了一个不存在的文件夹,该文件夹位于测试包而不是应用程序的实际包下。
设置 Espresso 测试时,如何访问和写入应用的范围存储?
解决方案
InstrumentationRegistry.getInstrumentation().context
为您提供测试 APK 的上下文。
InstrumentationRegistry.getInstrumentation().targetContext
为您提供被测 APK 的上下文。
如果该目录尚未创建,getExternalFilesDir
可能会null
第一次返回,因此您可能需要调用它两次。
在targetSdk=30
API 30 模拟器上,这:
companion object {
@BeforeClass @JvmStatic
fun beforeClass() {
val targetContext = InstrumentationRegistry.getInstrumentation().targetContext
Log.d("storage", targetContext.getExternalFilesDir(null).toString())
Log.d("storage", targetContext.getExternalFilesDir(null).toString())
}
}
将在第一次安装/运行时打印:
D/storage: null
D/storage: /storage/emulated/0/Android/data/com.example.test/files
这在第二次运行:
D/storage: /storage/emulated/0/Android/data/com.example.test/files
D/storage: /storage/emulated/0/Android/data/com.example.test/files
更多关于行为targetSdk=30
:
https ://developer.android.com/training/data-storage/use-cases#migrate-legacy-storage
推荐阅读
- python - 从 pct_change 返回的动态时间窗口内的最大值
- json - 无法从 Angular 的 API 访问子接口数据。我究竟做错了什么?
- .net - 如何使用此示例在 .net MVC 2 中使用谷歌日历 API https://developers.google.com/calendar/quickstart/dotnet
- parallel-processing - Julia pmap:如何有效地将辅助函数发送给其他工作人员?
- android - android,,camera 无法在屏幕关闭或应用程序未聚焦在屏幕上时访问
- amazon-athena - 限制用户选择数据库的访问权限
- java - 关于“双重检查锁定”的另一个问题
- lua - 如何在 Lua 中存储特定值并检索连接?
- c# - 如何将 MySQL 数据库数据推送到 MVC .NET Web 应用程序
- java - After 方法:在 '-' 或 ' ' 处剪切字符串