[英]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.