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 老项目迁移系列,持续更新中。

相关推荐
专业程序开发源15 分钟前
SSM校园拍摄交流服务平台36936-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·php·课程设计
用户0942485680317 分钟前
第23章:OpenJDK逃逸分析、标量替换与锁优化
java·jvm
wuminyu19 分钟前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
樱花落木兰29 分钟前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
HAHAXX836 分钟前
电商RPA批量上架通用方案:一套流程如何同时跑通拼多多、抖店、淘宝和跨境平台
java·运维·rpa
\光辉岁月/39 分钟前
3.java运算符
java·开发语言
mjhcsp1 小时前
DeepSeek V4.1 Flash 批量处理效能实测
java·前端·数据库
海绵宝宝转agent2 小时前
操作系统八股开源笔记分享
java·面试
事圆则缓2 小时前
Android 多渠道打包实战:Product Flavors、签名、AAB 与发包校验
android