2

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

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

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

4

1 回答 1

0

我知道这不是一个简单的解决方案,但您可以使用 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
于 2014-05-09T19:46:37.847 回答