我正在测试这个场景:
我在我的测试中有一个对象,它有一个LocalDateTime
。
当我通过objectmap创建一个JSON的对象,结果会不同,因为在JSON对象我有毫秒和我没有。
将响应体中的内容与字符串out of object进行比较:
assertThat(jsonOutOfTheObject, is(objectMapper.writeValueAsString(object)));
对象LocalDateTime
字段中的应该是这样的:
2022-06-30T19:42:57.118286
和JSON-body中的
2022-06-30T19:42:57
所以它们不一样,测试就会失败。
我尝试了truncatedTo(ChronoUnit.SECONDS)
和withNano(0)
,但它们并不总是给我有效的结果,因为如果毫秒将超过500000,它们将其四舍五入。
解决方案吗?
更新:
我注意到截断工作得很好,问题是JSON中的LocalDateTime
值已被四舍五入!
我添加了这个代码来处理四舍五入:
private static final int MILLISECOND_EDGE_FOR_ROUND_UP = 500000000;
private LocalDateTime roundUpSecond(LocalDateTime date) {
if (date.getNano() > MILLISECOND_EDGE_FOR_ROUND_UP) {
return date.plusSeconds(1).truncatedTo(ChronoUnit.SECONDS);
}
return date.truncatedTo(ChronoUnit.SECONDS);
}
我想这是一个序列化问题。
你必须有一个自定义的JsonSerializer,因为ObjectMapper不能处理LocalDateTime开箱,据我所知。
因此必须在某个地方有一个序列化模式,如SimpleDateFormat("dd-MM-yyyy hh:mm:ss")。将毫秒数添加到此模式中,您的比较应该没问题。