【问题标题】:How to mock the minute value when mocking LocalDateTime?模拟LocalDateTime时如何模拟分钟值?
【发布时间】:2019-10-16 01:08:52
【问题描述】:

关于如何模拟我的 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

所以看起来日期被模拟得很好,但是我无法模拟时间。我应该怎么做才能模拟分钟值?

【问题讨论】:

  • 如果你也想要时间值,不要打电话给atStartOfDay()。你希望它有什么价值?如果2019-10-15T19:15:22,那么LOCAL_DATE_TIME.atZone(ZoneId.systemDefault()).toInstant() 会这样做。

标签: java unit-testing java-8 java-time systemtime


【解决方案1】:

转换为LocalDate 会删除LocalDateTime 的时间部分,所以不要这样做。

像这样初始化你的fixedClock

fixedClock = Clock.fixed(
  LOCAL_DATE_TIME.atZone(ZoneId.systemDefault()).toInstant(), 
  ZoneId.systemDefault()
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多