Spring Cloud Contract DSL验证日期格式

时间:2017-10-01 22:39:19

标签: jodatime spring-cloud-contract

如何验证合约中的日期格式?我刚刚遇到一个问题,我的服务继承了一个对象映射器,它将我的服务返回的日期格式从毫秒改为时间戳。我试图写一份能够捕捉日期格式变化的合同。这是我在合同中的内容:

response {
    status 200
    body(
            time: 1505276760077L
    )
}

以下是我在对象映射器中玩的内容:

@Bean
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JodaModule());

    /*
    uncommenting this cause DateTime format to change from 
    milliseconds to timestamp
    i.e., 1505276760077 changes to 2017-09-13T04:26:00.077Z
    Either way, the test passes
     */
    // objectMapper.configure(SerializationFeature
               .WRITE_DATES_AS_TIMESTAMPS, false);

    return objectMapper;
}

无论日期格式如何,测试都会通过。当格式发生变化时,是否有某种方法可以使测试失败?

如果有帮助,我在这里有一个示例项目:https://github.com/rtteal/consumer-driven-contacts-demo

更新

我尝试更新合同以使用正则表达式,但在更改对象映射器时仍然无法使我的测试失败。

response {
    status 200
    body(
            time: $(regex('[0-9]{13}'))
    )
}

这是生成的测试的相关部分:

assertThatJson(parsedJson).field("['time']").matches("[0-9]{13}");

测试似乎忽略了对象映射器配置。我需要做些什么来让它在运行测试时拿起对象映射器吗?

1 个答案:

答案 0 :(得分:0)

您可以将正则表达式用于日期(http://cloud.spring.io/spring-cloud-static/Dalston.SR3/#_regular_expressions)。然后将为您生成有效日期。您还可以设置priority字段的低值(表示更高的优先级)。如果您需要为无效日期创建单独的合同,您可以做的是创建一个匹配nonBlank()值的日期对。设置priority字段的较高值(表示较低的优先级)。这样,您将拥有2个用于验证2个行为的相同URL的合同。 1)有效日期,2)无效日期

更新:

您正在使用MockMvc进行独立设置。这意味着它会忽略您拥有的任何上下文配置。如果您希望将您创建的bean考虑在内(https://github.com/rtteal/consumer-driven-contacts-demo/blob/master/src/test/java/com/example/DemoBase.java#L17),请使用webAppContextSetup方法。查看此页面 - https://piotrminkowski.wordpress.com/2017/04/26/testing-java-microservices/获取示例。