Kotlin 测试中无法导入 MockK:Maven 依赖该如何配置?
在这个 Maven + Kotlin/JVM 项目中,先将 MockK 依赖的 artifactId 从 mockk 改为 mockk-jvm,保留 <scope>test</scope>。import io.mockk.every 的写法本身没有问题。MockK 官方依赖配置
为什么 classpath 中有依赖,仍然无法导入?
MockK 以 Kotlin Multiplatform 方式发布。io.mockk:mockk 是多平台入口,Maven 不会像支持 Gradle Module Metadata 的 Gradle 那样自动选择 JVM 变体,因此需要显式声明 io.mockk:mockk-jvm。MockK 项目对 Maven 平台依赖的说明
即使 IDE 的依赖列表中有 mockk-1.14.9.jar,也不能据此确认测试编译时可以访问 JVM 版 API。当前配置使用了多平台入口,可以先从这里排查。由于缺少完整报错和测试文件的实际路径,也不能排除源码目录或 IDE 同步问题。
1. 替换 Maven 依赖
删除原来的 io.mockk:mockk 声明,换成下面的依赖,暂时沿用问题中的版本:
<dependency>
<groupId>io.mockk</groupId>
<artifactId>mockk-jvm</artifactId>
<version>1.14.9</version>
<scope>test</scope>
</dependency>
改动的是 Maven artifact 名称,Kotlin 包名仍然是 io.mockk,导入语句保持为:
import io.mockk.every
import io.mockk.mockk
无需将导入路径改为 io.mockk.jvm.every,也无需移除 test scope 来让测试引用依赖。
2. 确认测试文件位于测试源码目录
所给的 pom.xml 已将测试源码目录配置为:
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
测试类应放在类似下面的位置:
src/test/kotlin/com/example/demo/DemoApplicationTests.kt
如果文件实际位于 src/main/kotlin,它就无法访问 test scope 的依赖。类名以 Tests 结尾,或添加 @Test、@SpringBootTest,都不会自动改变文件的源码归属;归属由目录和构建配置决定。
3. 重新加载 Maven,并检查测试编译
修改 pom.xml 后,先在 IDE 中重新加载 Maven 项目,再从项目根目录执行:
mvn dependency:tree "-Dincludes=io.mockk:*"
mvn test-compile
如果项目使用 Maven Wrapper,可以将 mvn 替换为 ./mvnw。
依赖树中应能看到 io.mockk:mockk-jvm:1.14.9 及其 JVM 相关依赖。接着确认 test-compile 日志中确实编译了测试源码,再判断导入是否恢复:
- 命令行测试编译通过、IDE 仍标红:优先检查 Maven 同步状态,以及 IDE 是否将该目录识别为测试目录。
- 命令行也提示
Unresolved reference:继续检查依赖是否加入了测试类所在模块,以及解析出的依赖树。 - 出现 Kotlin metadata 或版本不兼容错误:根据完整错误检查 Kotlin 编译器和库版本,不能仅凭当前导入失败就认定 Kotlin 2.2.0 不兼容。
4. 用一个简单测试验证 MockK API
可以在 src/test/kotlin/com/example/demo/MockkImportTest.kt 中添加以下测试:
package com.example.demo
import io.mockk.every
import io.mockk.mockk
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals
interface GreetingService {
fun greet(name: String): String
}
class MockkImportTest {
@Test
fun returnsConfiguredGreeting() {
val service = mockk<GreetingService>()
every { service.greet("Kotlin") } returns "Hello, Kotlin"
assertEquals("Hello, Kotlin", service.greet("Kotlin"))
}
}
执行:
mvn -Dtest=MockkImportTest test
这个测试只验证 MockK 的导入、创建 mock 和配置返回值,无需启动 Spring 容器,所以没有使用 @SpringBootTest。原来的 Spring 上下文测试可以继续保留;该注解不能解决依赖导入问题。
备注:内容仅供参考。
