Eclipse泛型处理异常:JDBI的withExtension方法提示未处理Exception错误
问题根因
该报错确实由Eclipse内置Java编译器的泛型推导逻辑缺陷导致:
JDBI的withExtension方法声明了泛型参数<X extends Exception>表示方法可能抛出的异常类型,当你使用Mockito的any()匹配器调用该方法时,Eclipse无法推导出X的具体类型,默认将其识别为受检异常Exception,而你的测试方法未声明抛出该异常,因此触发编译错误。IntelliJ和Maven使用的javac编译器泛型推导能力更强,能识别到mock场景下无实际异常抛出,因此不会报错。
可行解决方案
- 方案1:使用Mockito的
doReturn写法(最推荐)doReturn的打桩逻辑不会触发被mock方法的编译期异常检查,无需修改原有方法签名或泛型声明,修改对应代码行即可:
doReturn(new ArrayList<>()).when(jdbi).withExtension(any(), any());
- 方案2:给测试方法添加
throws Exception声明
JUnit原生支持测试方法抛出异常,只需修改测试方法签名即可,改动量最小:
@Test public void testGetUser() throws Exception { // 原有代码不变 }
- 方案3:显式指定泛型参数,强制异常类型为非受检的RuntimeException
调用withExtension时手动指定三个泛型参数的实际类型,避免Eclipse推导错误:
when(jdbi.<List<User>, UserDao, RuntimeException>withExtension(any(), any())).thenReturn(new ArrayList<>());
其中三个泛型参数依次对应方法返回值类型、扩展DAO接口类型、抛出异常类型。
内容的提问来源于stack exchange,提问作者LuizPoleto
相关产品推荐
相关产品推荐

