我一直在阅读有关使用PowerMock在Java中模拟System Date函数的一些答案,但似乎有必要将注释添加到正在测试的实际类中。让我稍微提出这个问题。我正在一家大公司实习,在一个使用Spring,JUnit,Mockito等系统上进行单元测试。我当前的任务是测试一个端点,该端点依赖于当前时间对数据库(有点像检查一个截止日期)。
我的问题是:在不触及主要源代码的情况下,在测试类中模拟系统日期是否可能或直观?我不想修改源代码;即使它是在测试环境中,我宁愿保持它不受影响。或者只是修改数据库条目以更改日期,执行测试,然后使用事务测试回滚更有意义吗?非常感谢!
我想要模拟的课程是:java.util.Date cDate = new java.util.Date();
答案 0 :(得分: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