多模块Android Compose测试出现Resources$NotFoundException如何解决
多模块Android Compose测试跨模块字体资源找不到解决方案
该问题的根本原因是默认配置下,androidTest的资源合并范围仅包含当前模块的资源,不会自动引入依赖模块的资源,而生产打包时会合并所有依赖模块的资源,所以正常运行时不会报错。
1. 调整依赖配置
在search模块的构建配置文件中,明确声明androidTest对core-ui模块的依赖,同时开启测试资源合并:
- 如果是Groovy语法的
build.gradle,修改如下:
dependencies { // 原有生产环境core-ui依赖 implementation project(':core-ui') // 新增测试环境core-ui依赖 androidTestImplementation project(':core-ui') } android { testOptions { unitTests { // 开启单元测试包含Android资源 includeAndroidResources = true } } }
- 如果是Kotlin DSL的
build.gradle.kts,修改如下:
dependencies { implementation(project(":core-ui")) androidTestImplementation(project(":core-ui")) } android { testOptions { unitTests { isIncludeAndroidResources = true } } }
2. 修正Compose测试Rule写法
不要使用无参数的createComposeRule,该方法默认使用测试上下文加载资源,无法读取依赖模块的资源,必须使用绑定应用上下文的createAndroidComposeRule:
@get:Rule // 传入search模块的测试Activity,或者直接用Application的Context也可以 val composeTestRule = createAndroidComposeRule<TestActivity>() @Test fun testSearchComponent() { composeTestRule.setContent { // 直接使用core-ui模块中定义的全局主题,不要手动指定资源加载 YourAppCoreTheme { // 要测试的组件 } } // 后续测试逻辑 }
3. 临时兼容方案
如果上述配置都不生效,可以在search模块的androidTest/res/font目录下,新建和core-ui模块中同名的字体占位文件,测试环境会优先读取该目录下的资源,不会影响生产打包逻辑。
内容的提问来源于stack exchange,提问作者Matt Robertson
相关产品推荐
相关产品推荐

