0

如何验证合同中的日期格式?不久前我遇到了一个问题,我的服务继承了一个对象映射器,该映射器将我的服务返回的日期格式从毫秒更改为时间戳。我正在尝试编写一份可以捕捉日期格式更改的合同。这是我在合同中写的:

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}");

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

4

1 回答 1

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/以获取示例。

于 2017-10-02T08:23:09.577 回答