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

Kotlin中Mockito测试抛出Checked异常无效问题求助

问题原因

报错org.mockito.exceptions.base.MockitoException: Checked exception is invalid for this method! Invalid: com.abc.xtz.api.EntityNotFoundException的核心原因是:Mockito不允许给未在方法签名中声明抛出的Checked异常做模拟抛出。

你要模拟的ItemManager.deleteItemsByTokens方法,签名里没有声明会抛出EntityNotFoundException(该异常属于Checked异常),因此Mockito会拦截这种不符合规则的操作,抛出上述错误。

解决办法

1. 修正方法签名(推荐)

如果业务逻辑上deleteItemsByTokens确实可能抛出EntityNotFoundException,直接修改该方法签名,显式声明这个异常:

  • Kotlin方法添加@Throws注解:
fun deleteItemsByTokens(tokens: List<String>) @Throws(EntityNotFoundException::class) {
    // 方法实现
}
  • Java方法添加throws声明:
public void deleteItemsByTokens(List<String> tokens) throws EntityNotFoundException {
    // 方法实现
}

修改后,Mockito即可正常模拟该异常的抛出。

2. 将Checked异常转为非Checked异常

如果业务上deleteItemsByTokens不需要声明这个Checked异常,可把EntityNotFoundException改为继承RuntimeException(Kotlin默认所有异常都是非Checked,若为Java异常类则修改父类),这样Mockito允许模拟抛出,无需修改方法签名。

3. 强制抛出(不推荐)

若以上两种方式都无法实施,可用Mockito的doThrow语法绕过检查,但这会违背Java/Kotlin的异常契约,可能引发意料之外的问题:

doThrow(EntityNotFoundException::class.java).`when`(mockItemManager).deleteItemsByTokens(anyList())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:25:23