JUnit5 Pact契约测试场景下Mockito ArgumentCaptor使用报错问题
问题根因
- ArgumentCaptor泛型类型不匹配
你的业务代码中client.send()接收的参数是SendEvent类型,但你定义的ArgumentCaptor<Event>泛型为Event类型,类型不匹配会触发Mockito校验失败,这个异常会被Pact框架捕获,判定为Provider方法调用失败。 - 违反Pact消息契约的Provider方法规则
@PactVerifyProvider标注的方法需要直接返回待验证的消息体内容,Pact框架会自动完成契约内容比对。你在该方法内调用Mockito的verify逻辑,一旦校验逻辑触发异常,会直接导致Pact框架标记方法执行失败。
解决方案
场景1:仅需要完成Pact契约验证,无需额外参数校验
直接移除ArgumentCaptor相关代码,构造并返回符合要求的消息内容即可:
@State("state") @PactVerifyProvider("pactVerifyProvider") public String pactEvent() throws JsonProcessingException { Event foo = // 构造你的测试用Event实例 manager.sendEvent(foo); // 返回序列化后的消息内容,可根据契约要求调整序列化方式 return new ObjectMapper().writeValueAsString(new SendEvent(foo)); }
场景2:确实需要捕获client.send的参数做自定义校验
首先修正ArgumentCaptor的泛型类型,再将参数捕获逻辑移到Pact校验执行完成后的钩子方法中,避免自定义校验异常影响Pact的正常执行:
// 修正泛型为SendEvent,和client.send的参数类型保持一致 @Captor private ArgumentCaptor<SendEvent> captor; @State("state") @PactVerifyProvider("pactVerifyProvider") public String pactEvent() throws JsonProcessingException { Event foo = // 构造测试用Event实例 manager.sendEvent(foo); // 先完成Pact要求的消息返回,不在这里插入自定义校验逻辑 return new ObjectMapper().writeValueAsString(new SendEvent(foo)); } @AfterEach void doCustomCheck() { // Pact校验完成后再执行参数捕获和自定义校验 verify(client).send(captor.capture()); SendEvent capturedPayload = captor.getValue(); // 在此处添加你自己的参数校验逻辑 }
补充说明
Pact本身没有限制和Mockito的ArgumentCaptor配合使用,本次报错是代码逻辑不符合Pact的执行规则、以及类型匹配错误导致的,不属于Pact的已知问题。
内容的提问来源于stack exchange,提问作者Asdf11
相关产品推荐
相关产品推荐

