强制本地日期时间为给定值,以便执行 JUnit 测试

2023-12-21

在我的 Java 应用程序中,我必须编写一个单元测试,并且必须检查该测试是否在一年中的夏令时/正常时间下都有效。为此,我应该设置一个硬编码的日期时间来覆盖服务器日期时间;执行我的测试;并恢复真实的日期时间。

我怎样才能做到这一点?我找到了这个解决方案https://www.baeldung.com/java-override-system-time https://www.baeldung.com/java-override-system-time但这不是我真正需要的(它只定义了一个即时实体以在特定指令中使用,但我需要修复所需的日期时间,然后使用一些不直接连接到即时的方法来执行测试)。

Java.time 是首选。

Edit

分配给我的测试应该只从 Excel 文件(在 Excel 中格式为日期时间)读取数据单元格,并与固定日期进行比较。

这是详细的描述:

  1. 有一个 Excel 文件,其单元格格式为“日期时间”

  2. 我读了这个单元格

     Workbook excelWorkbook = new Workbook(excelFileStream, excelOptions);
     Cells cells = worksheet.getCells();
    
  3. 工作表的单元格(如果按日期时间格式化)

  4. 我的实现中的方法读取单元格并创建一个日期时间变量

就这样。我的任务是,创建一个单元测试,以检查给定值是否始终正确,独立于夏令时/一年中的正常时间。我应该“强制”服务器的本地日期时间,通过创建类似的东西来实现测试

assertThat(ExcelCellDateTime).isEqualTo("<given date time>");

并将 Java 应用程序的日期时间恢复为服务器的正确日期时间。所以问题是:

如何在 Java 应用程序的单元测试中模拟某个日期时间,独立于服务器的实际日期时间,以便应用程序“相信”当前日期时间是我强制的日期时间,并且测试可以“作为”执行' 现在等于我强制的日期时间?

对可能重复的评论

我不认为这与建议的问题重复。我不想强制指定日期并将新日期与其他日期进行比较,但我想强制指定日期并在不使用新日期作为参数的情况下执行测试。


您的业​​务逻辑应该被赋予Clock https://docs.oracle.com/javase/8/docs/api/java/time/Clock.html实例提供当前时间(和时区,必要时),而不是使用静态方法,例如LocalDateTime.now()这隐藏了对环境的依赖。它就像一个可插入的工厂,用于各种“现在”的概念。

当你的逻辑使用Clock,测试使用起来很简单有固定时间的时钟 https://docs.oracle.com/javase/8/docs/api/java/time/Clock.html#fixed-java.time.Instant-java.time.ZoneId-测试夏令时转换、闰日和其他日期时间极端情况下的正确行为。

设计良好的代码易于用于任何目的,包括测试。这种测试困难是设计不良的症状,表明代码很难以其他方式重用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

强制本地日期时间为给定值,以便执行 JUnit 测试 的相关文章

随机推荐