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

