如何使用 JUnit 5 测试 Kafka 消息消费者的 PACT
Howto test PACT for Kafka message consumer with JUnit5
在我们的项目中,我们使用 JUnit 5。我们想用 pact 测试我们的 Kafka 消息。在互联网上,我找到了一些 JUnit 4 示例以及一些 JUnit 5 和 REST 示例。我到目前为止是:
import au.com.dius.pact.consumer.MessagePactBuilder;
import au.com.dius.pact.consumer.MockServer;
import au.com.dius.pact.consumer.dsl.PactDslJsonBody;
import au.com.dius.pact.consumer.junit5.PactConsumerTestExt;
import au.com.dius.pact.consumer.junit5.PactTestFor;
import au.com.dius.pact.consumer.junit5.ProviderType;
import au.com.dius.pact.core.model.annotations.Pact;
import au.com.dius.pact.core.model.messaging.MessagePact;
import AdresseBean;
import PersonGeloeschtConsumer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.UUID;
@ExtendWith(MockitoExtension.class)
@ExtendWith(PactConsumerTestExt.class)
@PactTestFor(providerName = "personservice-kafka")
public class PersonGeaendertEventConsumerPactTest {
@InjectMocks
private PersonGeloeschtConsumer personGeloeschtConsumer;
@Mock
private AdresseBean adresseBean;
@Pact(provider = "personservice-kafka", consumer = "adresseservice-kafka")
public MessagePact createPact(MessagePactBuilder builder) {
PactDslJsonBody body = new PactDslJsonBody();
body.stringType("eventUuid", UUID.randomUUID().toString())
.stringMatcher("status", "NEU|GELOESCHT|GEAENDERT", "GELOESCHT")
.integerType("id", 123l)
.closeObject();
return builder.given("Person wird geändert")
.expectsToReceive("PersonGeaendertEvent")
.withContent(body)
.toPact();
}
@Test
@PactTestFor(pactMethod = "createPact", providerType = ProviderType.ASYNCH)
public void test(MockServer mockServer) throws Exception {
// TODO
// personGeloeschtConsumer.verarbeiteRecord(String message);
}
}
在我的 POM 中,我得到了以下依赖项:
<dependency>
<groupId>au.com.dius</groupId>
<artifactId>pact-jvm-consumer-junit5</artifactId>
<version>4.0.1</version>
<scope>test</scope>
</dependency>
我的问题是,如何从 createPact() 方法中获取 Message 到测试方法中。有没有其他人使用 JUnit 5 和 PACT 来验证 Kafka 消息?
解决方案很简单:必须在以下位置传递一个 MessagePact 对象,而不是 MockServer:
@Test
@PactTestFor(pactMethod = "createPact", providerType = ProviderType.ASYNCH)
public void test(MessagePact messagePact) throws Exception {
String text = new String(messagePact.getMessages().get(0).contentsAsBytes());
personGeloeschtConsumer.verarbeiteRecord(text);
}
在我们的项目中,我们使用 JUnit 5。我们想用 pact 测试我们的 Kafka 消息。在互联网上,我找到了一些 JUnit 4 示例以及一些 JUnit 5 和 REST 示例。我到目前为止是:
import au.com.dius.pact.consumer.MessagePactBuilder;
import au.com.dius.pact.consumer.MockServer;
import au.com.dius.pact.consumer.dsl.PactDslJsonBody;
import au.com.dius.pact.consumer.junit5.PactConsumerTestExt;
import au.com.dius.pact.consumer.junit5.PactTestFor;
import au.com.dius.pact.consumer.junit5.ProviderType;
import au.com.dius.pact.core.model.annotations.Pact;
import au.com.dius.pact.core.model.messaging.MessagePact;
import AdresseBean;
import PersonGeloeschtConsumer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.UUID;
@ExtendWith(MockitoExtension.class)
@ExtendWith(PactConsumerTestExt.class)
@PactTestFor(providerName = "personservice-kafka")
public class PersonGeaendertEventConsumerPactTest {
@InjectMocks
private PersonGeloeschtConsumer personGeloeschtConsumer;
@Mock
private AdresseBean adresseBean;
@Pact(provider = "personservice-kafka", consumer = "adresseservice-kafka")
public MessagePact createPact(MessagePactBuilder builder) {
PactDslJsonBody body = new PactDslJsonBody();
body.stringType("eventUuid", UUID.randomUUID().toString())
.stringMatcher("status", "NEU|GELOESCHT|GEAENDERT", "GELOESCHT")
.integerType("id", 123l)
.closeObject();
return builder.given("Person wird geändert")
.expectsToReceive("PersonGeaendertEvent")
.withContent(body)
.toPact();
}
@Test
@PactTestFor(pactMethod = "createPact", providerType = ProviderType.ASYNCH)
public void test(MockServer mockServer) throws Exception {
// TODO
// personGeloeschtConsumer.verarbeiteRecord(String message);
}
}
在我的 POM 中,我得到了以下依赖项:
<dependency>
<groupId>au.com.dius</groupId>
<artifactId>pact-jvm-consumer-junit5</artifactId>
<version>4.0.1</version>
<scope>test</scope>
</dependency>
我的问题是,如何从 createPact() 方法中获取 Message 到测试方法中。有没有其他人使用 JUnit 5 和 PACT 来验证 Kafka 消息?
解决方案很简单:必须在以下位置传递一个 MessagePact 对象,而不是 MockServer:
@Test
@PactTestFor(pactMethod = "createPact", providerType = ProviderType.ASYNCH)
public void test(MessagePact messagePact) throws Exception {
String text = new String(messagePact.getMessages().get(0).contentsAsBytes());
personGeloeschtConsumer.verarbeiteRecord(text);
}