如何向提供商传达数据格式的合同协议

时间:2018-12-12 21:21:55

标签: consumer pact pact-java

是否可以生成一个PACT文件来传达数据格式验证?

我想要完成的事的一个例子: 作为消费者,我希望其中包含一些数据的“ phoneNumber”字段。我还希望电话号码必须包含7到10位数字。它可能包含破折号和/或括号。

在使用者测试(下面的代码)中,我构造了响应对象,因此可以指定期望的格式。但这并不意味着提供者受到相同的限制。 (即,他们可能会以这种方式提供它,但是他们也可能会以我不期望的格式提供它。)

我猜想,验证数据的最合乎逻辑的方法是在PACT文件中提供一些RegEx作为元数据。这是可以做到的吗?如果是这样,您如何在代码中提供它。

下面的代码片段有助于可视化我的操作方式: (代码段的信用转到“ https://github.com/Mikuu/Pact-JVM-Example”)

    Object homerUser = new Object() {
        public String name = "Homer Simpson";
        public String phoneNumber = "1-234-5678";
    };
    JSONObject responseBody = new JSONObject(new ObjectMapper().writeValueAsString(homerUser));

    RequestResponsePact pact = ConsumerPactBuilder
            .consumer(consumer)
            .hasPactWith(provider)
            .given("User Homer Exist")
            .uponReceiving("getUserById where homer exists")
                .path("/users/1")
                .method("GET")
                .headers(requestHeader)
            .willRespondWith()
                .status(HttpStatus.OK.value())
                .headers(responseHeader)
                .body(responseBody)
            .toPact();

    PactVerificationResult result = runConsumerTest(pact, getProviderConfig(), mockServer -> {
        ResponseEntity<User> response = userProvider.getUserById(1);
        assertThat(response.getStatusCode().value(), is(200));
        assertThat(response.getHeaders().get(HttpHeaders.CONTENT_TYPE), contains(MediaType.APPLICATION_JSON_UTF8_VALUE));
        assertThat(response.getBody(), notNullValue());
        assertThat(response.getBody().phoneNumber, matchesPhoneNumberPattern());
    });

1 个答案:

答案 0 :(得分:0)

是的,您可以使用正则表达式。查看pact-jvm的匹配器文档。