如何为JVM PACT合同中的post参数更新主体上的动态日期?

问题描述

我有一个POST请求,该请求将合同文件中的日期作为参数进行PACT测试。

return builder
    .uponReceiving("A request to create a Zoom meeting")
    .path(createMeeting)
    .method("POST")
    .headers(headers)
    .body("{\"title\":\"My title\",\"start_time\":\"2020-08-28T14:30:00Z+01:00\",\"duration\":30,\"provider\":\"ZOOM\"}")
    .willRespondWith()
    .body(body)
    .toPact();

但是我希望这是动态的,可能有今天或明天的日期,否则它将有过期的日期。您能否建议如何执行此操作,并在可能的情况下避免与消费者接触。

这些都是我的请求的消费者和提供者示例。

消费者

@ExtendWith(PactConsumerTestExt.class)
public class PACTConsumerEdUiVcTest {

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

String createMeeting = "/manage/create-meeting";

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

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

    DslPart body = new PactDslJsonBody()
            .date("start_time","yyyy-MM-dd'T'HH:mm:ss.000'Z'",new Date());


    return builder
            .uponReceiving("A request to create a Zoom meeting")
            .path(createMeeting)
            .method("POST")
            .headers(headers)
            .body("{\"title\":\"My title\",\"provider\":\"ZOOM\"}")
            .willRespondWith()
            .body(body)
            .toPact();
}

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

    //Mock url
    RestAssured.baseURI = "http://localhost:8080";

    Response response = RestAssured //todo: dynamic start time that won't expire. 27/08/2020
            .given()
            .headers(headers)
            .when()
            .body("{\"title\":\"My title\",\"provider\":\"ZOOM\"}")
            .post(createMeeting);

    assert (response.getStatusCode() == 200);
}

}

提供商

@Provider(VC)
@PactFolder("target/pacts")

public class PactProviderEdUiVcTest {

@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(BASE_PACT_VC_URL,443,"/"));

    getAuthorizationToken(UserType.TEACHER);
}

@State("A request to create a Zoom meeting")
public void sampleState() {
}

}

非常感谢。

解决方法

能够通过更改RestAssured实现来使其工作,以接受map并将日期用作其值。

map.put("start_time",new Date().toString());

这是完整的作品。

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

    //Mock url
    RestAssured.baseURI = "http://localhost:8080";

    Map<String,Object> map = new HashMap<>();
    map.put("title","MyTitle");
    map.put("start_time",new Date().toString());
    map.put("duration",30);
    map.put("provider","ZOOM");

    Response response = RestAssured //todo: dynamic start time that won't expire. 27/08/2020
            .given()
            .headers(headers)
            .when()
            .body(map)
            .post(createMeeting);

    assert (response.getStatusCode() == 200);
}