Pact 异步消费者测试失败,消息为空

问题描述 投票:0回答:1

我正在测试为测试应用程序创建异步协议,该应用程序使用 RabbitMQ 我让应用程序运行,但创建协议的测试失败并出现以下错误。

%TESTS  3,verifyCreatePersonPact(io.reflectoring.MessageConsumerTest)

%ERROR  3,verifyCreatePersonPact(io.reflectoring.MessageConsumerTest)
%TRACES 
java.lang.NullPointerException: Cannot read the array length because "bytes" is null
        at java.base/java.lang.String.<init>(String.java:1437)
        at io.reflectoring.MessageConsumerTest.verifyCreatePersonPact(MessageConsumerTest.java:45)

这是 gradle 文件:

plugins {
    id 'org.springframework.boot' version '3.1.0'
    id 'io.spring.dependency-management' version '1.1.0'
    id 'java'
    id 'au.com.dius.pact' version '4.6.1'
    id 'java-library'
}

version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

repositories {
    mavenLocal()
    mavenCentral()
}

dependencies {

    implementation 'org.springframework.boot:spring-boot-starter-web' 
    implementation 'org.springframework.boot:spring-boot-starter-amqp'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
 
    implementation 'com.h2database:h2:1.4.196'
    compileOnly 'org.projectlombok:lombok:1.18.2' 
    runtimeOnly 'javax.xml.bind:jaxb-api:2.3.1'
    runtimeOnly 'org.javassist:javassist:3.23.1-GA'

    testImplementation 'org.springframework.boot:spring-boot-starter-test' 
    testImplementation 'au.com.dius.pact.consumer:junit5:4.6.1'
}

test {
    useJUnitPlatform()
}

bootRun {
    jvmArgs = ["-Xdebug", "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"]
}

这是测试文件

package io.reflectoring;

import java.io.IOException;

import au.com.dius.pact.consumer.MessagePactBuilder;
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 org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;

@ExtendWith(PactConsumerTestExt.class)
public class MessageConsumerTest {

    private byte[] currentMessage;

    @Autowired
    private MessageConsumer messageConsumer;

    @Pact(provider = "userservice", consumer = "userclient")
    public MessagePact userCreatedMessagePact(MessagePactBuilder builder){
        PactDslJsonBody body = new PactDslJsonBody();
        body.stringType("messageUuid");
        body.object("user")
            .numberType("id", 42L)
            .stringType("name", "Zaphod Beeblebrox")
                        .closeObject();

        // @formatter:off
        return builder
            .expectsToReceive("a user created message")
            .withContent(body)
            .toPact();
        // @formatter:on
    }

        @Test 
    @PactTestFor(pactMethod = "userCreatedMessagePact", providerType = ProviderType.ASYNCH)
    void verifyCreatePersonPact() throws IOException {
        messageConsumer.consumeStringMessage(new String(this.currentMessage));
    }

    /**
     * This method is called by the Pact framework.
     */
    public void setMessage(byte[] message) {
        this.currentMessage = message;
    }
}

我正在关注这个示例:https://github.com/thombergs/code-examples/blob/master/pact/pact-message-consumer/src/test/java/io/reflectoring/MessageConsumerTest.java

但是我正在更新java版本,gradle以及pact版本。

感谢您的帮助。

所以我已经尝试将 @BeforeEach 添加到 setMessage 方法中。并在那里精心传达信息。

如果有人能给我一些可能失败的提示?另外,如果它可以与更高版本的 gradle 一起使用,那就太好了。

java gradle pact pact-broker asynctest
1个回答
0
投票

我不认为

setMessage
是一件事,或者至少不再是了。

可以在此处找到使用相对较新版本的示例项目:https://github.com/pactflow/example-consumer-java-kafka/blob/master/src/test/java/io/pactflow/example/kafka /ProductsPactTest.java#L49

  @Test
  @PactTestFor(pactMethod = "createPact")
  void test(List<Message> messages) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    System.out.println("Message received -> " + messages.get(0).contentsAsString());
    Product product = mapper.readValue(messages.get(0).contentsAsString(), Product.class);

    assertDoesNotThrow(() -> {
      listener.listen(product);
    });
  }

注意消息如何直接注入到测试中。

© www.soinside.com 2019 - 2024. All rights reserved.