java - 在不更改 src 代码的情况下在 Java 中模拟 Date()

标签 java spring junit mocking mockito

我在这里阅读了一些关于使用 PowerMock 在 Java 中模拟系统日期函数的答案,但似乎有必要将注释添加到被测试的实际类中。让我稍微设置一下这个问题。我在一家大公司实习,在使用 Spring、JUnit、Mockito 等的系统上进行单元测试。我当前的任务是测试一个端点,该端点依赖于当前时间对数据库(有点像检查一个截止日期)。

我的问题是:在不触及主要源代码的情况下在测试类中模拟系统日期是否可能或直观?我不想修改源代码;即使它在测试环境中,我也宁愿保持不变。或者仅修改数据库条目以更改日期、执行我的测试然后使用事务测试回滚是否更有意义?非常感谢!

我要模拟的类是:java.util.Date cDate = new java.util.Date();

最佳答案

我知道这不是一个简单的解决方案,但您可以使用 byteman ( https://community.jboss.org/wiki/ABytemanTutorial ) 将日期快进系统属性中找到的天数。将其复制到名为 addDaysToJvmDate.btm 的文件中:

RULE Calling java.util.Date()
CLASS java.util.Date
METHOD <init>()
AT EXIT
IF TRUE
DO $0.fastTime = java.lang.System.currentTimeMillis() + (86400000 *    java.lang.Long.parseLong(java.lang.System.getProperty("addDays")));
ENDRULE

并使用以下命令启动您的 JVM:

java - javaagent:${BYTEMAN_HOME}/lib/byteman.jar=script:addDaysToJvmDate.btm,boot:${BYTEMAN_HOME}/lib/byteman.jar -cp yourclasspath yourapp

关于java - 在不更改 src 代码的情况下在 Java 中模拟 Date(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17275759/

相关文章:

javafx - Kotlin中尚未使用TestFX初始化lateinit属性xxx

java - 当我读取 GPS 位置时 Android 返回 null

Ubuntu 12.04 中的 Java FileNotFoundException?

spring - 从 DTO 填充查询参数

ajax - 如何在生成供下载的 PDF 文件时显示进度条,而没有 IE "download"警告

java - 当单元测试方法具有断言而不是异常时,最佳实践是什么?

java - SpringBootTest - 只创建必要的bean

java - 创建自定义 JAXB 注释

java - 自定义列表开始新 Activity ?

mysql - 使用 MySQL 8 的事务性 Spring Boot 测试回滚事务,但无论如何都会插入行