Pact 消费者联系方式给出 au.com.dius.pact.consumer.PactMismatchesException

Pact consumer contact gives au.com.dius.pact.consumer.PactMismatchesException

我是 Pact 合约测试的新手

Gradle dependencies

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    
    //pact
    testImplementation 'au.com.dius.pact.consumer:junit5:4.3.6'
}

Rest Controller

@RestController
public class CodeController {
    
    @GetMapping("/hello")
    public String hello() {
        return "Hello from spring with pact project";
    }
}

ControllerClient

@Component
public class ControllerClient{
    private final RestTemplate restTemplate;

    public ControllerClient(@Value("${user-service.base-url}") String baseUrl) {
        this.restTemplate = new RestTemplateBuilder().rootUri(baseUrl).build();
    }
    
    public String getHello() {
        return restTemplate.getForObject("/hello", String.class);
    }
}

ConsumerContractTest

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, properties = "user-service.base-url:http://localhost:8080", classes = ControllerClient.class)
@ExtendWith(PactConsumerTestExt.class)
public class ConsumerContractTest {

    @Autowired
    private ControllerClient controllerClient;

    @Pact(consumer = "code-consumer")
    public RequestResponsePact pactForHelloWorld(PactDslWithProvider builder) {
        return builder
                .given("hello world")
                .uponReceiving("hello request")
                    .path("/hello")
                    .method(HttpMethod.GET.name())
                .willRespondWith().status(200)
                    .body(new PactDslJsonBody().stringType("Hello from spring with pact project"))
                .toPact();
    }

    @PactTestFor(pactMethod = "pactForHelloWorld", pactVersion = PactSpecVersion.V3)
    @Test
    public void userExists() {
        String returnStr = controllerClient.getHello();
        assertThat(returnStr).isEqualTo("Hello from spring with pact project");
    }
}

当我执行这个消费者合同测试时,我遇到了以下异常

au.com.dius.pact.consumer.PactMismatchesException: The following requests were not received:
    method: GET
    path: /hello
    query: {}
    headers: {}
    matchers: MatchingRules(rules={})
    generators: Generators(categories={})
    body: MISSING
    at au.com.dius.pact.consumer.junit.JUnitTestSupport.validateMockServerResult(JUnitTestSupport.kt:110)
    at au.com.dius.pact.consumer.junit5.PactConsumerTestExt.afterTestExecution(PactConsumerTestExt.kt:468)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeAfterTestExecutionCallbacks(TestMethodTestDescriptor.java:233)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeAllAfterMethodsOrCallbacks(TestMethodTestDescriptor.java:273)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeAllAfterMethodsOrCallbacks(TestMethodTestDescriptor.java:273)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
    ....

问题是您的测试没有将请求发送到 Pact 模拟服务 - 这就是您收到错误“未收到以下请求”的原因。

您应该按如下方式修改您的单元测试:

    @PactTestFor(pactMethod = "pactForHelloWorld", pactVersion = PactSpecVersion.V3)
    @Test
    public void userExists(MockServer mockServer) {
        // TODO: set endpoint on controllerClient to mockServer.getUrl()
        String returnStr = controllerClient.getHello();
        assertThat(returnStr).isEqualTo("Hello from spring with pact project");
    }

查看此方法的示例 here