PAYATHON 2026

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 上下文测试可以继续保留;该注解不能解决依赖导入问题。

备注:内容仅供参考。