3

我需要使用 Pact 测试和 REST Assured 检查 /meeting/id 类型的 api。id 可能会更改,我想在测试之前创建一个项目并注入他们的 id 以覆盖作为合同 url 路径的一部分设置的内容,但不知道该怎么做?

这是我的消费者:

@ExtendWith(PactConsumerTestExt.class)
public class PactConsumerTest {

Map<String, String> headers = new HashMap<>();


String storeMeetingPath = "/meeting/256";

@Pact(provider = VC, consumer = ED_UI)
public RequestResponsePact createPact(PactDslWithProvider builder) {

    headers.put("Content-Type", "application/json");
    headers.put("Accept", "application/json");

    return builder
            .given("A request to retrieve a meeting for a user")
            .uponReceiving("A request to retrieve a meeting for a user")
            .path(storeMeetingPath)
            .method("GET")
            .headers(headers)
            .willRespondWith()
            .body(new PactDslJsonBody()
                    .integerType("meetingId", 3)
                    .stringType("meetingTitle", "My title")
                    .stringType("meetingDescription", "My description"))
            .status(200)
            .toPact();
}


@Test
@PactTestFor(providerName = VC, port = "8080")
public void runTest() {

    //Mock url
    RestAssured.baseURI = "http://localhost:8080";
    RequestSpecification rq = RestAssured
            .given()
            .headers(headers)
            .when();

    rq.get(storeMeetingPath);

}

}

这里是我的提供者:

@Provider(VC)
@PactFolder("target/pacts")
public class PactProviderTest {

@TestTemplate
@ExtendWith(PactVerificationInvocationContextProvider.class)
void pactTestTemplate(PactVerificationContext context, HttpRequest request) {
    request.addHeader("Authorization", AUTHORIZATION_TOKEN);
    context.verifyInteraction();
}

@BeforeEach
void before(PactVerificationContext context) {
    context.setTarget(new HttpsTestTarget(getBasePactEndpoint(), 443, "/"));

    // Will create a meeting and retrieve the id from here but how to use this to overwrite what is there on the consumer?       

    getAuthorizationToken(UserType.TEACHER);
}

@State("A request to retrieve a meeting for a user")
public void sampleState() {

}

}

非常感谢你。

4

1 回答 1

6

我已经了解了这个问题的答案,以防万一它对其他人有帮助:

替换消费者合同上的这一行

.path(storeMeetingPath)

.pathFromProviderState("/meeting/${id}", "/meeting/500") // 500 is just a sample for the data type to be inferred. It can be any value from that same type.

这样我们就有了一个带有默认值的模板。

并在提供者方面进行更改

@State("A request to retrieve a meeting for a user")
public void sampleState() {

} 

取而代之的是,它返回一个映射,该映射将为要注入的元素设置键和值。

@State("A request to retrieve a meeting for a user")
public Map sampleState() {

    Map<String, Integer> map = new HashMap<>();
    map.put("id", 391); // id for the meeting I want to retrieve.

    return map;
}

辅助文档:

消费者:https ://github.com/DiUS/pact-jvm/tree/master/consumer#having-values-injected-from-provider-state-callbacks

提供者:https ://github.com/DiUS/pact-jvm/tree/master/provider/junit#returning-values-that-c​​an-be-injected

于 2020-09-18T13:38:52.637 回答