繁体   English   中英

Mockito 未能通过 Pact 合同测试

[英]Mockito fails with Pact contract tests

Mockito ArgumentCaptor 在 JUnit5 Pact 合同测试中失败

在将 Pact 与 Mockito (JUnit5) 一起使用时,我发现了一个奇怪的行为:

我想在测试中获取 Manager class 的Client.send(payload)中的payload内容:

public void send(Event event){

    var payload = new SendEvent(event);
    client.send(payload);
  }

所以在测试中我们通常可以检查Client.send(payload)调用,什么工作没有任何问题:

manager.sendEvent(foo);
verify(client).send(payload);

尽管使用ArgumentCaptor获取内容会导致以下错误:

@Captor
private ArgumentCaptor<Event> captor;

@State("state")
@PactVerifyProvider("pactVerifyProvider")
public String pactEvent(){
   manager.sendEvent(foo);
   verify(client).send(captor.capture());
}


=> Verification Failed - Failed to invoke provider method '...'

有谁知道这是否是一个已知问题? 使用Pact时基本上无法抓取内容。 相同的代码只有普通的Mockito可以正常工作,没有任何缺陷。

完整的堆栈跟踪:



Event
    generates a message which
    Verification Failed - Failed to invoke provider method 'sendEvent'

...


java.lang.AssertionError: Service - Generates message 'event'  
Failures:

1) Event

    1.1) Failed to invoke provider method 'sendEvent'

    at au.com.dius.pact.provider.junit5.PactVerificationContext.verifyInteraction(PactVerificationContext.kt:63)
    at test.ContractTest.testTemplate(ProviderContractTest.java:80) -> thats where "context.verifyInteraction();"" is used
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
    at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
    at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
    at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
    at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)

Process finished with exit code -1

所以 ArgumentCaptors 似乎不能与 Pact 一起使用?

编辑:更正了 ArgumentCaptor 并添加了完整的堆栈跟踪

我找到了解决方案:

    @State("state")
    @PactVerifyProvider("pactVerifyProvider")
    public String pactEvent(){
       manager.sendEvent(foo);
       verify(client).send(captor.capture());
}

@State需要引用一个空方法,因此设置一个空的 state 独立于@PactVerifyProvider

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM