当前位置: 首页 > 知识库问答 >
问题:

基本PACT/JUNIT5测试设置失败。找不到提供程序错误的用@pact批注的方法

柴默
2023-03-14

我试图按照Pact.io上的文档编写一个简单的集成测试。不幸的是,我得到一个例外,如下所示:

 org.junit.jupiter.api.extension.ParameterResolutionException: Failed to resolve parameter [au.com.dius.pact.consumer.MockServer mockServer] in method [public void com.example.demo.integration.pact.PactTest.setUp(au.com.dius.pact.consumer.MockServer)]: No method annotated with @Pact was found on test class PactTest for provider 'node_server'
package com.example.demo.integration.pact;

import au.com.dius.pact.consumer.MockServer;
import au.com.dius.pact.consumer.dsl.PactDslWithProvider;
import au.com.dius.pact.consumer.junit5.PactConsumerTestExt;
import au.com.dius.pact.consumer.junit5.PactTestFor;
import au.com.dius.pact.core.model.RequestResponsePact;
import au.com.dius.pact.core.model.annotations.Pact;
import org.apache.http.HttpResponse;
import org.apache.http.client.fluent.Request;
import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

import java.io.IOException;

import static org.junit.jupiter.api.Assertions.assertEquals;


@ExtendWith(PactConsumerTestExt.class)
@PactTestFor(providerName = PactTest.PACT_PROVIDER_NAME)
public class PactTest {

    public static final String PACT_PROVIDER_NAME = "node_server";

    public static final String PACT_CONSUMER_NAME = "spring_application";

    @BeforeEach
    public void setUp(MockServer mockServer) {
        System.out.println("Mockserver check called");
        Assertions.assertTrue(mockServer != null);
    }

    @Pact(provider = PACT_PROVIDER_NAME, consumer = PACT_CONSUMER_NAME)
    public RequestResponsePact createPact(PactDslWithProvider builder) {

        return builder
                .uponReceiving("notes")
                .path("/notes")
                .method("GET")
                .willRespondWith()
                .matchHeader("Content-Type","application/json")
                .status(200)
                .body(
                        getJsonArrayOfNotes(2).toString())
                .toPact();
    }

    @Test
    @PactTestFor(pactMethod = "notes")
    void test(MockServer mockServer) throws IOException {
        HttpResponse httpResponse = Request.Get(mockServer.getUrl() + "/notes").execute().returnResponse();
        assertEquals(200, httpResponse.getStatusLine().getStatusCode());
        assertEquals(getJsonArrayOfNotes(2).toString(),httpResponse.getEntity().getContent().toString());
    }

    private JSONArray getJsonArrayOfNotes(int size) {
        var responseJsonObject = new JSONArray();
        for (int i = 0; i < size; i++) {
            var note = new JSONObject();
            try {
                note.put("title", String.format("Title %s", i + 1));
                note.put("content", String.format("Some Note Content of Note %s", i + 1));
            } catch (Exception exception) {

            }
            responseJsonObject.put(note);
        }
        return responseJsonObject;
    }

}


共有1个答案

李利
2023-03-14

带有@pact批注的方法名称似乎必须与@pactTestFor批注中的pactMethod相同...

在我的情况下,我不得不写以下内容:

@Test
@PactTestFor(pactMethod = "getNotes")
void test(MockServer mockServer) throws IOException {
        HttpResponse httpResponse = Request.Get(mockServer.getUrl() + "/notes").execute().returnResponse();
        assertEquals(200, httpResponse.getStatusLine().getStatusCode());
        assertEquals(getJsonArrayOfNotes(2).toString(),httpResponse.getEntity().getContent().toString());
    }

@Pact(provider = PACT_PROVIDER_NAME, consumer = PACT_CONSUMER_NAME)
public RequestResponsePact getNotes(PactDslWithProvider builder) {

        return builder
                .uponReceiving("notes")
                .path("/notes")
                .method("GET")
                .willRespondWith()
                .matchHeader("Content-Type","application/json")
                .status(200)
                .body(
                        getJsonArrayOfNotes(2).toString())
                .toPact();
    }

 类似资料:
  • 关于测试提供程序,我有几个问题: 在进行测试之前,是否需要启动提供程序服务?我应该在测试中到达实际的提供者endpoint吗?例如,假设我的提供者代码库上有一个GET/dogsendpoint。运行测试时,是否需要在本地启动服务,点击/dogsendpoint,然后用pact文件验证为该endpoint返回的响应? 如果我想将其作为配置项管道的一部分运行(我使用的是Circloci),那么有哪些最

  • 我用Spring创建了一个REST服务。现在我想使用pact和JUnit5来测试消费者-提供者-通信。我已经有一个正在运行的pact-broker(来自https://github.com/jaimeniswonger/pact-broker-openshift)。消费者测试工作良好,并公布了协议。provider-test加载这些并尝试验证它们。但测试仅在验证成功时才上载结果。我尝试用suref

  • 我们有一个提供程序测试,只是在Jenkins上失败了,这阻止了我的调试。 (有些省略……) 交互在pact文件中如下所示: 我的印象是名称应该匹配type而不是确切的值,而且在diff中似乎有一个“name”字段。

  • 测试运行的结果如下: 由于使用本地协议文件会使测试变为绿色,我想原因不在我的测试类代码中,不过如果有帮助的话,我在这里提供它: 由于使用本地协议文件不是一个选项,我真的想知道如何修复错误,并将感谢任何有帮助的意见。

  • 我是新手。我的应用程序是一个spring boot应用程序。消费者在协议代理中创建了协议。现在我正在尝试从providers端运行测试,我正在使用gradle插件来运行测试。我有几个问题: > 使用者发布 协议没有指定任何状态。这意味着我不需要在提供者端使用任何stateChangeUrl? 我想实现的是:当我说pactVerify 服务器启动,我的Spring Boot应用程序应该在localh