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

相关推荐
传奇开心果编程5 分钟前
从替代到粒度:Compose Multiplatform 的决策模式重构已开启跨平台新时代
kotlin·移动开发·跨平台·cmp·编程语言理论·编程框架·声明式ui
paopaokaka_luck1 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_32241428042 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
三少爷的鞋2 小时前
Kotlin 协程,重点就在「协」这个字上
android·kotlin
考虑考虑3 小时前
JDK26的JEP 500属性
java·后端·java ee
LMT流氓兔3 小时前
第五单元——第十二课:把脚本整理成项目
java·数据库·python·langchain·1024程序员节
yuniko-n3 小时前
【JUC】四种内存屏障示例
java·1024程序员节
好的佩奇3 小时前
Dart 之模式
android·flutter·dart
念何架构之路4 小时前
Go reflect 包:结构体反射 —Field、Tag 与 VisibleFields
java·数据库·golang
liangbo74 小时前
03-JDK 10/11 局部变量推断与 LTS:var 到底该怎么用
java