
本文旨在解决在使用 JPA 存储 LocalDateTime 类型数据时,集成测试中出现的精度不一致问题。通过分析测试代码和数据库存储值的差异,提供一种修正方案,确保测试结果与实际数据相符。本文将重点关注如何正确地在集成测试中验证 LocalDateTime 字段,避免因精度问题导致的断言失败。
在集成测试中,我们经常需要验证数据库中存储的数据是否与预期一致。当涉及到 LocalDateTime 类型的数据时,由于数据库存储精度和 Java 对象精度的差异,可能会导致断言失败。例如,在提供的例子中,测试代码期望 _embedded.positionsSnapshotDToes.linkTime 的值为 2022-11-09T10:01:03.152146400,而实际数据库存储的值为 2022-11-09T10:01:03.152146。这是因为数据库可能只存储到微秒级别,而 Java 的 LocalDateTime 对象可以存储到纳秒级别。
要解决这个问题,我们需要在测试代码中进行适当的转换,以匹配数据库存储的精度。以下是一种可行的解决方案:
从响应中解析 LocalDateTime 对象: 不要直接将 LocalDateTime 对象转换为字符串进行比较,而是从响应中解析出 LocalDateTime 对象。
使用 LocalDateTime.parse() 方法: 使用 LocalDateTime.parse() 方法将从响应中获取的字符串转换为 LocalDateTime 对象。
直接比较 LocalDateTime 对象: 将解析后的 LocalDateTime 对象与预期的 LocalDateTime 对象进行比较。
修改后的测试代码如下:
@Test
shouldPassLinkTime()
{
final LocalDateTime anyLinkTime = LocalDateTime.now();
posSnapshotRepo.save(
PositionsSnapshot.builder()
.linkTime(anyLinkTime)
.build()
);
SnapshotFilterDTO dto = SnapshotFilterDTO.builder()
.build();
given()
.spec(correctCredentialsAndPortSpec)
.log().ifValidationFails()
.contentType("application/json")
.body(MAPPER_HELPER.writeValueAsString(dto))
.when()
.post("service/unmatched")
.then()
.statusCode(200)
.log().ifValidationFails()
.and().body("_embedded.positionsSnapshotDToes.linkTime[0]", equalTo(anyLinkTime.toString().substring(0,26)))
.and().body("page.totalPages", equalTo(1))
.and().body("page.totalElements", equalTo(1))
.and().body("page.number", equalTo(0));
}代码解释:
在集成测试中验证 LocalDateTime 类型的数据时,需要注意数据库存储精度和 Java 对象精度的差异。通过从响应中解析 LocalDateTime 对象,并使用 LocalDateTime.parse() 方法进行转换,可以避免因精度问题导致的断言失败。此外,还需要注意时区和序列化/反序列化等问题,以确保测试结果的准确性。
以上就是LocalDateTime 集成测试中的精度差异问题解决的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号