首页 > 解决方案 > 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 测试时,如何访问和写入应用的范围存储?

标签: androidandroid-espressoandroid-external-storageandroid-instrumentationscoped-storage

解决方案


InstrumentationRegistry.getInstrumentation().context为您提供测试 APK 的上下文。 InstrumentationRegistry.getInstrumentation().targetContext为您提供被测 APK 的上下文。

如果该目录尚未创建,getExternalFilesDir可能会null第一次返回,因此您可能需要调用它两次。

targetSdk=30API 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


推荐阅读