Kotlin MockK问题:内部方法调用时Mock失效,如何调用真实方法?
MockK中调用真实方法的正确姿势(解决内部方法依赖问题)
你的问题核心是:当mock了类的某个方法后,调用依赖该方法的其他内部方法时,默认不会走真实逻辑,导致报错。下面是两种靠谱的解决方式:
方式一:用spyk创建实例,仅mock目标方法
spyk是MockK里用来包装真实实例的工具,默认保留所有方法的真实实现,你只需要单独mock需要替换的方法即可:
- 创建spyk实例:
val itemService = spyk(ItemServiceImpl())
(不需要加relaxed=true,spyk本身就是基于真实实例的,这个参数对它无效)
- mock指定方法:
every { itemService.getItemsForWarehouse(any()) } returns 你的模拟数据
- 调用依赖方法:
此时调用itemService.getPickingListsForWarehouse()会走真实的方法逻辑,内部调用getItemsForWarehouse时会用你mock好的返回值,不会触发“no answer found”错误。
方式二:用mockk创建对象,指定特定方法走真实逻辑
如果已经用mockk创建了整个类的mock对象,想要让某个方法走真实实现,可以用answers { callOriginal() }来配置:
- 创建mock对象:
val itemService = mockk<ItemServiceImpl>()
- 配置mock方法和真实方法:
// 模拟getItemsForWarehouse的返回 every { itemService.getItemsForWarehouse(any()) } returns 你的模拟数据 // 指定getPickingListsForWarehouse走真实逻辑 every { itemService.getPickingListsForWarehouse(any()) } answers { callOriginal() }
这样配置后,调用getPickingListsForWarehouse时会执行真实的方法代码,内部依赖的getItemsForWarehouse则用你mock的结果。
常见坑提醒
- 不要给spyk加
relaxed=true:这个参数是给纯mock对象用的,让未配置的方法返回默认值,对spyk完全没必要,甚至可能干扰真实逻辑的执行。 - 确保内部调用的方法是public的:如果
getItemsForWarehouse是私有方法,需要在创建spyk时加上recordPrivateCalls = true,并通过privateFun来mock,但你的场景里应该是public方法,所以不用额外处理。
内容的提问来源于stack exchange,提问作者hc0re
相关产品推荐
相关产品推荐

