使用Mockito模拟回调函数时出现Incompatible equality constraint错误如何解决
错误诱因
该错误由两个问题共同触发:
- 泛型约束不匹配
useCacheElseCompute的泛型T和第二个入参valueClass的类型绑定,本次业务调用中传入的valueClass是NotificationTemplateDTO.class,因此第三个参数Supplier<T>的实际泛型为Supplier<NotificationTemplateDTO>。但测试代码里手动指定的泛型为Supplier<NotificationTemplateRepository>,和实际需要的类型冲突,触发了泛型相等约束校验错误。 - 方法参数匹配语法错误
测试代码中第三个参数的匹配器后多闭合了一个括号,导致原本属于useCacheElseCompute第四个入参的any(Long.class)被放置在方法参数列表之外,Mockito无法匹配到对应方法签名。
修复方案
修正泛型参数与括号位置即可,修正后的测试代码如下:
@Test void testGetNotificationMessage() { Mockito.when(mockCacheService.useCacheElseCompute( templateCacheKey, NotificationTemplateDTO.class, ArgumentMatchers.<Supplier<NotificationTemplateDTO>>any(), ArgumentMatchers.any(Long.class) )).thenReturn(null); }
如果不需要显式指定泛型,也可以直接简化写法,Mockito会自动推导泛型:
@Test void testGetNotificationMessage() { Mockito.when(mockCacheService.useCacheElseCompute( templateCacheKey, NotificationTemplateDTO.class, ArgumentMatchers.any(), ArgumentMatchers.any(Long.class) )).thenReturn(null); }
内容的提问来源于stack exchange,提问作者Arvind Choudhary
相关产品推荐
相关产品推荐

