模拟LocalDateTime时如何模拟分钟值?

问题描述 投票:0回答:1

我参考了有关如何模拟LocalDateTime.now()调用的答案How can I mock java.time.LocalDate.now()。我基本上遵循了所有步骤,但是只使用LocalDateTime而不是LocalDate。

我的代码的功能仅应在每小时的第15或45分钟运行。因此,我将我的LOCAL_DATE_TIME静态变量设置为以下值:

private final static LocalDateTime LOCAL_DATE_TIME = LocalDateTime.of(2019,10,15,19,15,22);

然后在我的@Before测试方法中,我有以下内容:

    @Mock
    private Clock clock;

    private Clock fixedClock;
    private final static LocalDateTime LOCAL_DATE_TIME = LocalDateTime.of(2019,10,15,19,15,22);

这是2019-10-15T19:15:22。

    @Before
    public void before(){
        fixedClock = Clock.fixed(LOCAL_DATE_TIME.toLocalDate().atStartOfDay(ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault());
        doReturn(fixedClock.instant()).when(clock).instant();
        doReturn(fixedClock.getZone()).when(clock).getZone();
    }

这是我正在测试的代码

@Override
public void punctuate(long l) {
    LocalDateTime localDateTime = LocalDateTime.now(clock);
    int currentMinute = localDateTime.getMinute();

    if(currentMinute == 15 || currentMinute == 45) { ....

当我在上面的第一行上放置一个断点时,我看到localDateTime设置为2019-10-15T00:00

因此,看起来日期被模拟得很好,但是我无法模拟时间。我该如何模拟分钟值?

java unit-testing java-8 java-time systemtime
1个回答
1
投票

转换为LocalDate会删除LocalDateTime的时间部分,因此请勿这样做。

像这样初始化您的fixedClock

fixedClock = Clock.fixed(
  LOCAL_DATE_TIME.atZone(ZoneId.systemDefault()).toInstant(), 
  ZoneId.systemDefault()
);
© www.soinside.com 2019 - 2024. All rights reserved.