java - 模拟 Instant.now() 而不在构造函数中使用时钟或没有时钟对象
问题描述
我的一种方法中有以下代码
ZonedDateTime current = Instant.now().atZone(ZoneId.of(AMERICA_NEW_YORK));
我想current
在 JUnit 测试中进行模拟。
我试过了,java.time.Clock
但为此,我需要将它添加到类构造函数中,因为我的代码被写入旧版本的 Spring 并使用基于 XML 的配置,这个类会导致问题,因为它需要 application-context.xml 文件中的构造函数参数,如果我将构造函数与Clock
.
有什么办法可以避免current
上面代码中的构造函数配置和模拟。
更新
根据 Pavel Smirnov 的评论,我在下面尝试过,但current
仍然返回今天的日期,但不是我嘲笑的那个。
ZonedDateTime exactOneDay = ZonedDateTime.parse("Sun Oct 21 12:30:00 EDT 2018", Parser);
doReturn(exactOneDay).when(spyEmployeeHelper).getCurrentTime();
employee = getEmployees().get(0);
assertEquals(Integer.valueOf(1), employee.getNoticePeriod());
解决方案
您可以声明一个返回的函数ZoneDateTime
:
public ZoneDateTime getCurrentTime () {
return Instant.now().atZone(ZoneId.of(AMERICA_NEW_YORK));
}
并将该函数的结果分配给该current
字段:
ZonedDateTime current = getCurrentTime();
现在您可以使用Mockito 框架简单地将其替换为所需的值:
doReturn(yourValue).when(yourObject).getCurrentTime();
推荐阅读
- java - 使用 PKIXValidator 和 BouncyCastleFipsProvider 进行服务器证书验证?
- ruby-on-rails - Twilio:使用多个不同的消息响应用户输入
- c++ - 为什么这个不正确的 std::function 初始化使用 MSVC 编译?
- php - 在 Magento 2.2 中支付订单后自动发送发票电子邮件
- javascript - 我可以使用 Visual Studio Code 分析 NodeJS 应用程序吗?
- qt - Qt - 清除布局后未正确将小部件添加到 QHBoxLayout
- android - 以编程方式访问下载的文件
- identityserver4 - 如何使用 IdentityServer 添加审计日志
- jar - 设置后我无法立即登录 Metabase
- python-3.x - pytest 用 boto3 模拟