Mockito → MockK

Mockito → MockK

老写法(Java + Mockito)

java 复制代码
@Mock ApiService apiService;
@Captor ArgumentCaptor<String> captor;

@Test
public void test() {
    when(apiService.loadItems()).thenReturn(items);
    verify(apiService, times(1)).loadItems();
}

问题在哪里

Mockito 对 Kotlin 的支持不够好------final 类和 final 方法在 Kotlin 中默认不可 mock,需要额外配置。不支持 suspend 函数(除非用 mockito-kotlin 桥接库)。语法是 Java 风格的 when(...) 而非 Kotlin 惯用的 DSL。

新写法(MockK)

kotlin 复制代码
// 基础用法 --- 和 Mockito 相似但更 Kotlin 化
@MockK lateinit var apiService: ApiService

@Test
fun test() = runTest {
    every { apiService.loadItems() } returns items
    viewModel.loadItems()
    verify(exactly = 1) { apiService.loadItems() }
}

// suspend 函数 --- MockK 原生支持
coEvery { apiService.loadItems() } returns items
coVerify { apiService.loadItems() }

// Slot --- 替代 ArgumentCaptor
val slot = slot<String>()
every { apiService.search(capture(slot)) } returns items
viewModel.search("query")
assertEquals("query", slot.captured)

// relaxed mock --- 所有方法自动返回默认值
@RelaxedMockK lateinit var repo: ItemRepository

一句话注意

MockK 是 Kotlin 原生的 mocking 库,every {} 替代 when()verify {} 替代 verify()coEvery/coVerify 处理 suspend 函数。最重要的是 MockK 不需要 mock-maker-inline 配置就能 mock final 类,Kotlin 的默认行为就是 final。

Mockito 的 argThat(argumentMatcher) 在 MockK 里用 lambda:match<Item> { it.id == 1 },比 Java 的 ArgumentMatcher 简洁很多。


Java Android 老项目迁移系列,持续更新中。

相关推荐
Zane19942 小时前
ThreadLocal 与 BlockingQueue:线程本地变量的内存泄漏原理,以及阻塞队列怎么选?
java·后端
用户3126874877202 小时前
Spring Bean 生命周期到底经历了什么?从实例化到销毁的全链路拆解
java·spring boot
Flittly2 小时前
【我的手搓轮子日记】(2)handmade-ioc 手搓 IOC 容器
java·spring boot·spring
阿昌喜欢吃黄桃2 小时前
Dubbo服务重启时注册中心下线不及时问题排查与修复记录
java·rpc·dubbo·问题排查
2 小时前
使用ffmpeg将mp4视频转为m3u8格式
android·ffmpeg·音视频
程序员钟霖2 小时前
【实战版】Spring IOC 控制反转详解
java·后端·spring·maven·intellij-idea
00后程序员张2 小时前
使用Instruments工具深入分析iOS应用性能与启动时间优化
android·macos·ios·小程序·uni-app·cocoa·iphone
confiself2 小时前
树形思考研究进展
java·大数据·微服务
还是鼠鼠2 小时前
【Spring AI智能体实战 01】Java开发者接入大模型:国内平台、Token与API Key入门
java·大模型·spring ai·deepseek·阿里云百炼