0

0

使用 LocalDateTime 进行集成测试时的时间精度问题

DDD

DDD

发布时间:2025-09-16 19:26:00

|

838人浏览过

|

来源于php中文网

原创

使用 localdatetime 进行集成测试时的时间精度问题

第一段引用:本文旨在解决在使用 JPA 存储 LocalDateTime 类型数据,并在集成测试中使用 JSON Path 进行断言时,由于数据库存储精度与 Java 对象精度不一致导致的测试失败问题。通过分析问题原因,提供了一种在集成测试中正确处理 LocalDateTime 类型数据的方法,确保测试的准确性和可靠性。

在使用 JPA 将 LocalDateTime 类型的数据存储到数据库时,需要注意数据库对时间戳的精度支持。不同的数据库可能对时间戳的精度支持不同,例如,某些数据库可能只支持到毫秒级别的精度,而 LocalDateTime 可以精确到纳秒级别。这就会导致在将 LocalDateTime 对象存储到数据库时,精度可能会丢失。

在集成测试中,通常会从数据库中读取数据,并将其与期望值进行比较。如果数据库中存储的 LocalDateTime 精度与 Java 对象中的精度不一致,就会导致断言失败。

问题分析

在提供的示例中,断言失败的原因是 anyLinkTime.toString() 方法返回的字符串精度高于数据库中存储的精度。具体来说,anyLinkTime.toString() 返回的字符串包含纳秒部分 (例如 2022-11-09T10:01:03.152146400),而数据库中存储的 linkTime 可能只精确到毫秒级别 (例如 2022-11-09T10:01:03.152146)。

解决方案

为了解决这个问题,可以在集成测试中将从数据库中读取的 LocalDateTime 对象转换为与期望值精度一致的字符串,或者直接比较 LocalDateTime 对象。

电力公司企业网站(Zblog内核)1.8
电力公司企业网站(Zblog内核)1.8

由于我高估了大家对zblog程序的熟知度,发现还有很多站长并不是太熟悉这款程序,甚至连后台的登陆入口都不清楚。所以我晚上抽了一点点时间把该ZBLOG企业网站源码进行的修正,补充了大家的一些问题。并且我写了比较详细的使用教程,能够帮助新手朋友修改变成自己的企业网站使用。 修订版本改进了几处问题: 第一,修正了单页面中的顶部BANNER FLASH幻灯图片的显示错误问题; 第二,修正了在产品中心标题显

下载

以下是直接比较 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", contains(anyLinkTime.toString())) // 修改点1
            .and().body("page.totalPages", equalTo(1))
            .and().body("page.totalElements", equalTo(1))
            .and().body("page.number", equalTo(0));
}

修改点说明:

  1. 将 equalTo(Arrays.asList(anyLinkTime.toString())) 修改为 contains(anyLinkTime.toString())。 这里使用 contains 是因为直接使用 equalTo 比较整个数组可能因为其他字段的精度问题而失败。 contains 确保数组中包含期望的时间字符串即可。

注意事项

  • 数据库精度: 在设计数据库表结构时,需要仔细考虑时间戳字段的精度。根据实际需求选择合适的精度,避免不必要的精度损失。
  • 测试环境一致性: 确保测试环境与生产环境的数据库配置一致,避免因数据库配置差异导致测试结果不准确。
  • 时区问题: 在处理 LocalDateTime 时,需要注意时区问题。确保测试环境和生产环境的时区设置一致,避免因时区差异导致测试失败。

总结

在使用 LocalDateTime 进行集成测试时,需要注意数据库对时间戳的精度支持。通过合理处理 LocalDateTime 对象的精度,可以避免因精度不一致导致的测试失败,确保测试的准确性和可靠性。 直接比较 LocalDateTime 对象是一种简单有效的解决方案。 此外,也可以考虑在测试中将 LocalDateTime 格式化为特定精度的字符串,再进行比较。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

419

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

299

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.9万人学习

Java 教程
Java 教程

共578课时 | 53.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号