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

KMM commonTest模块actual声明报错:无对应expect声明

KMM测试中expect/actual匹配问题的分析与解决

核心原因

KMM的commonTest模块确实默认能访问commonMain的代码,但测试用actual实现无法关联到expect声明,通常是以下细节没处理到位:

1. 包名与类名未完全匹配

测试用actual类必须和commonMain里的expect类包名、类名完全一致。比如commonMain中的expect是:

package com.example.myapp.core

expect class PlatformConfig() {
    fun getEnv(): String
}

那commonTest里的actual必须同样在com.example.myapp.core包下,类名也得是PlatformConfig,不能改包名或类名。

2. Gradle源集配置异常

检查项目的build.gradle.kts(或.gradle)文件,确认commonTest的依赖配置是否正确。正常情况下KMM插件会自动关联commonMain,但如果手动修改过配置,需确保:

sourceSets {
    val commonMain by getting
    val commonTest by getting {
        dependencies {
            implementation(kotlin("test"))
            // 确保commonMain的代码对commonTest可见(默认已配置,手动修改后可能丢失)
            implementation(commonMain.output)
        }
    }
    // ...其他平台源集配置
}

3. Android Studio缓存假报错

IDE缓存经常会出现“代码存在但提示找不到”的问题,尝试以下操作修复:

  • 点击菜单栏 File → Invalidate Caches...,选择Invalidate and Restart
  • 重新同步Gradle项目(点击右上角的大象图标或File → Sync Project with Gradle Files)

4. 测试用actual的位置错误

不要把测试用的actual放在平台测试源集(如androidTest或iosTest)里,必须放在commonTest的默认源目录src/commonTest/kotlin/下,才能被共享测试代码调用。

示例代码参考

commonMain中的expect声明:

package com.example.kmmdemo

expect class Logger {
    fun log(message: String)
}

commonTest中的测试用actual实现:

package com.example.kmmdemo

actual class Logger {
    actual fun log(message: String) {
        // 测试环境的简易实现,比如打印到控制台
        println("Test Log: $message")
    }
}

commonTest中的测试类调用:

package com.example.kmmdemo

import kotlin.test.Test

class SharedLogicTest {
    @Test
    fun testLoggerFunction() {
        val logger = Logger()
        logger.log("Test message")
        // 这里添加断言逻辑
    }
}

内容的提问来源于stack exchange,提问作者Felipe Ribeiro R. Magalhaes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 10:12:42