我有下面的代码在我的一个方法
ZonedDateTime current = Instant.now().atZone(ZoneId.of(AMERICA_NEW_YORK));
我想在JUnit测试中模拟current
。
我尝试使用java.time.Clock
,但为此,我需要将其添加到类构造函数中,因为我的代码是编写到旧版本的Spring中的,并且使用基于XML的配置此类会导致问题,因为如果我使用Clock
的构造函数,则需要application-context.xml文件中的构造函数参数。
有没有什么方法可以避免在上面的代码中配置构造函数和mock 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());
4条答案
按热度按时间mpgws1up1#
基于Mockito的解决方案,其中代码使用普通的
Instant.now()
解决方案说明
解决方案依赖于
Instant.now()
调用Clock.systemUTC().instant()
这一事实Clock
是抽象的,因此我们可以监视非静态方法clock.instant()
以返回所需的值Clock.systemUTC()
是静态的,所以我们需要mockStatic@Before
/@After
(或者您可以使用try(MockedStatic<Clock> clockMock = mockStatic(Clock.class)) {...}
)sz81bmfz2#
你可以声明一个返回
ZoneDateTime
的函数:并将该函数的结果分配给
current
字段:现在你可以简单地使用Mockito framework将其替换为所需的值:
bxfogqkk3#
使用Mockito时,您可以轻松地模仿如下:
添加超时测试示例:
vjhs03f74#
这里有一个与Java 17一起工作的解决方案,利用Mockito的静态mocking及其
CALLS_REAL_METHODS
选项来避免mocking所有Instant
的静态方法。