MockK如何不执行原方法即可Mock方法调用并返回指定值
MockK 不执行原方法Stub方法调用的正确用法
你之前使用every { method } returns value会触发原方法执行,是因为这个API的语义和Mockito中when(mock.method()).thenReturn(value)完全一致:当你操作spyk()创建的间谍(部分模拟)对象时,大括号内的方法调用会真实执行原逻辑,和Mockito的行为表现完全相同。
MockK提供了和MockitodoReturn(x).when(y).method()语义完全对等的API,Stub过程中不会触发任何原方法逻辑,写法如下:
doReturn(预设返回值).whenever(模拟/间谍对象) { 需要Mock的目标方法调用() }
用法示例
比如要对间谍对象的方法做Stub,全程不执行原方法:
// 基于真实类创建间谍对象 val orderService = spyk(OrderService()) // Stub queryOrderStatus方法,传入参数1001时直接返回"PAID",不执行原方法逻辑 doReturn("PAID").whenever(orderService) { queryOrderStatus(1001L) } // 调用时直接返回预设值,不会走原方法的数据库查询等逻辑 val status = orderService.queryOrderStatus(1001L) // 输出PAID
补充说明
- 注意区分
whenever和普通every:every会先执行大括号内的方法调用再完成Stub,doReturn...whenever会直接替换方法的执行逻辑,不会触发原方法 - 如果你使用
mockk()创建的纯模拟对象,默认所有方法都是空实现,不存在执行原方法的问题,此时用every做Stub不会有你遇到的问题 - 对应Mockito的
doThrow语义,MockK也提供了doThrow(异常实例).whenever(对象) { 方法调用() }写法,同样不会触发原方法执行
内容的提问来源于stack exchange,提问作者dosu
相关产品推荐
相关产品推荐

