Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JUnit5测试卡夫卡消息消费者的契约_Java_Apache Kafka_Junit5_Pact - Fatal编程技术网

Java 如何使用JUnit5测试卡夫卡消息消费者的契约

Java 如何使用JUnit5测试卡夫卡消息消费者的契约,java,apache-kafka,junit5,pact,Java,Apache Kafka,Junit5,Pact,在我们的项目中,我们使用JUnit5。我们想用pact测试卡夫卡的信息。在互联网上,我找到了一些JUnit4示例和一些JUnit5和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.co

在我们的项目中,我们使用JUnit5。我们想用pact测试卡夫卡的信息。在互联网上,我找到了一些JUnit4示例和一些JUnit5和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>

au.com.dius
pact-jvm-consumer-junit5
4.0.1
测验

我的问题是,如何将消息从createPact()方法获取到测试方法中。还有其他人使用JUnit 5和PACT来验证卡夫卡消息吗?

解决方案很简单:不使用MockServer,而必须传入MessagePact对象:

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

我不知道PACT,但我不清楚在哪里配置kafka属性,因为代码shownKafka没有直接涉及。使用PACT时,仅检查契约,即通过Kafka发送的消息是否符合契约。好的,那么当您在测试方法中创建
MessagePactBuilder
的实例并使用它调用
createPact
时会发生什么?