You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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实例等所有上下文,和MockitoInvocationOnMock提供的能力一致
  • 该配置方式不仅对普通Mock生效,用spyk()创建的Spy对象同样支持传入defaultAnswer配置默认应答规则
  • 除了返回默认值,你还可以在自定义应答里实现抛异常、记录调用参数、返回自定义伪对象等任意逻辑,灵活度和Mockito完全一致

内容的提问来源于stack exchange,提问作者Mark Dappollone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:30:47