You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多模块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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:24:08