如何在Mockk中设置Mock对象的默认Answer应答策略
Mockk 自定义默认应答实现方案
Mockk 完全支持创建Mock对象时配置全局默认应答规则,和你示例中Mockito的能力完全对齐,不需要为类的每个方法单独打桩。
对应Mockito示例的Mockk实现
你在Mockito中通过传入自定义Answer实例实现默认规则的写法,在Mockk中可以直接通过mockk()构造函数的defaultAnswer参数实现:
1. 创建Mock对象时指定自定义应答
// 对应Mockito中mock(StringProvider::class.java, StringProviderAnswer())的写法 val strings = mockk<StringProvider>(defaultAnswer = StringProviderMockkAnswer())
2. 自定义应答类实现
对应你写的StringProviderAnswer逻辑,Mockk的等价实现如下:
import io.mockk.Answer import io.mockk.Call class StringProviderMockkAnswer : Answer<Any?> { // 委托给Mockk默认应答逻辑,对应Mockito.RETURNS_DEFAULTS override fun answer(call: Call): Any? { val invocationMethodReturn = call.method.returnType val stringType = String::class.java return when (invocationMethodReturn) { stringType -> "${call.method.name}${call.args.joinToString()}" else -> call.returnsDefaultValue() } } }
简化写法
如果应答逻辑不需要复用,可以直接在Mock初始化块中传入lambda配置默认规则,不需要单独定义Answer类:
val strings = mockk<StringProvider> { defaultAnswer { if (method.returnType == String::class.java) { "${method.name}${args.joinToString()}" } else { returnsDefaultValue() } } }
补充说明
- 应答逻辑中可以通过回调上下文拿到当前调用的方法信息、入参、mock实例等所有上下文,和Mockito
InvocationOnMock提供的能力一致 - 该配置方式不仅对普通Mock生效,用
spyk()创建的Spy对象同样支持传入defaultAnswer配置默认应答规则 - 除了返回默认值,你还可以在自定义应答里实现抛异常、记录调用参数、返回自定义伪对象等任意逻辑,灵活度和Mockito完全一致
内容的提问来源于stack exchange,提问作者Mark Dappollone
相关产品推荐
相关产品推荐

