Mockito中ArgumentMatcher的泛型HttpEntity匹配不生效问题求助
问题原因及解决方案
这是Java泛型的类型擦除机制导致的,具体原因如下:
- Java泛型是编译时特性,编译完成后所有泛型类型信息都会被擦除。运行时
HttpEntity<FakeSendEmailDTO>和HttpEntity<NicoSendEmailDTO>本质上是同一个HttpEntity类,不存在泛型类型的区别。 - Mockito的
ArgumentMatchers.any()(包括你显式指定泛型的ArgumentMatchers.<HttpEntity<FakeSendEmailDTO>>any())在匹配参数时,只会校验参数的原始类类型,不会处理泛型信息——因为运行时根本拿不到泛型的具体类型,所以只要参数是HttpEntity实例,这个匹配器就会判定匹配成功。
如果你想让测试能校验HttpEntity中的DTO类型是否正确,需要手动检查HttpEntity的body内容,示例代码如下:
Mockito.verify(restTemplate, Mockito.times(1)).exchange( Mockito.eq(NicoMailingStrategy.API_ENDPOINT), Mockito.eq(HttpMethod.POST), ArgumentMatchers.argThat(entity -> { // 校验HttpEntity中的body是否为预期的DTO类型 return entity.getBody() instanceof NicoSendEmailDTO; }), Mockito.eq(String.class));
如果需要更严格的校验(比如同时检查body的字段值),可以在argThat的断言逻辑中进一步扩展:
ArgumentMatchers.argThat(entity -> { if (!(entity.getBody() instanceof NicoSendEmailDTO)) { return false; } NicoSendEmailDTO dto = (NicoSendEmailDTO) entity.getBody(); // 校验具体字段,比如收件人、主题等 return "test@example.com".equals(dto.getTo()) && "Test Subject".equals(dto.getSubject()); })
内容的提问来源于stack exchange,提问作者Nicolas Villacorta
相关产品推荐
相关产品推荐

