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

Kotlin使用Mockito.thenAnswer带条件时抛ClassCastException如何解决

问题根因

该异常和Kotlin非空校验机制无关,是Lambda语法书写错误导致返回值类型不匹配,最终触发ClassCastException。
你出错的thenAnswer代码片段多嵌套了一层大括号:

// 错误写法
Mockito.`when`(sampleService.serviceCall(testData)).thenAnswer { invocation -> {
  val numbers = invocation.getArgument<List<String>>(0)
  if ("123" == numbers[0] && "456" == numbers[1]) {
    "123456"
  } else {
    "654321"
  }
} }

在Kotlin语法规则中,Lambda的->后直接包裹的大括号块会被识别为一个独立的函数对象,类型为() -> String,而非你预期的字符串返回值。thenAnswer要求返回值和被Mock方法的返回类型(即String)一致,Mockito尝试将返回的函数对象强转为String时就会抛出类型转换异常。

之前两种可正常运行的写法均不存在该问题:

  • thenReturn("123456")直接返回固定字符串,类型完全匹配
  • 无分支逻辑的thenAnswer { invocation -> "123456" }直接返回字符串值,没有多余嵌套,类型匹配
修复方法

删除多余的嵌套大括号,直接在Lambda体内写处理逻辑即可,修正后代码:

Mockito.`when`(sampleService.serviceCall(testData)).thenAnswer { invocation ->
  val numbers = invocation.getArgument<List<String>>(0)
  if ("123" == numbers[0] && "456" == numbers[1]) {
    "123456"
  } else {
    "654321"
  }
}

额外优化提示:你同时使用了@ExtendWith(MockitoExtension::class)和MockitoAnnotations.initMocks(this),二者功能重复,保留@ExtendWith注解即可删除手动初始化Mock的代码,避免重复执行初始化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:06:27