Search code examples
javaapache-kafkajunit5pact

Howto test PACT for Kafka message consumer with JUnit5


In our project we use JUnit 5. We want to test our Kafka messages with pact. In the internet I found some JUnit 4 examples and some examples with JUnit 5 and REST. What I have so far is:

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);
    }
}

In my POM I got the following dependency:

<dependency>
    <groupId>au.com.dius</groupId>
    <artifactId>pact-jvm-consumer-junit5</artifactId>
    <version>4.0.1</version>
    <scope>test</scope>
</dependency>

My problem is, how to get the Message from the createPact() method into the test method. Has anyone else used JUnit 5 and PACT to verify Kafka messages?


Solution

  • The solution is simple: instead of the MockServer, one has to pass a MessagePact object in:

    @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);
    }