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
相关产品推荐
相关产品推荐

