繁体   English   中英

如何在测试 class 中模拟 System.currentTimeMillis?

[英]How to Mock System.currentTimeMillis in test class?

我试图模拟我的 getParams(),System.currentTimeMillis() 的原因


    public HashMap<String, String> getParams() {
        HashMap<String, String> params = new HashMap<>();
        params.put("page[number]", "0");
        params.put("page[size]", "20");
        params.put("filter[orders][state]", "NEW");
        params.put("filter[orders][creationDate][$ge]", String.valueOf(System.currentTimeMillis()-7000)); // 7000 - 10 days
        params.put("filter[orders][creationDate][$le]", String.valueOf(System.currentTimeMillis()));
        params.put("filter[orders][status]", "APPROVED_BY_BANK");
        params.put("filter[orders][signatureRequired]", "false");
        params.put("filter[orders][deliveryType]", "DELIVERY");
        params.put("include[orders]", "user");
        params.put("include[orders]", "entries");
        return params;
    }

这是我的服务,它发送当前时间,但是当我尝试测试它时,它会生成另一个与服务和测试不同的时间。 这给了我不同的结果,我无法检查它是否工作正常。

我试图模拟我的方法,但在运行时它没有模拟

RequestService myService = Mockito.spy(requestService);
        HashMap<String, String> params = new HashMap<>();
        params.put("page[number]", "0");
Mockito
                .doReturn(params)
                .when(myService).getParams();
   
//Mockito
                //.when(myService.getParams())
               // .thenReturn(params);

有什么建议可以解决我的问题吗?

-----------------编辑我解决了我的问题:

  public Date truncToSec(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.set(Calendar.MILLISECOND, 0);
        c.set(Calendar.SECOND, 0);
        Date newDate = c.getTime();
        return newDate;
Date currnetTime = new Date(System.currentTimeMillis() - 777600000) ;
currnetTime = truncToSec(currnetTime);
params.put("filter[orders][creationDate][$ge]", String.valueOf(currnetTime.toInstant().toEpochMilli())); // 777600000 - 10 days

但如果您有更好的解决方案,欢迎您。

我不知道这是否是首选方法,但我们有一个 java.time.Clock 的测试实现,并且被测试的类提供了一个包私有构造函数,您可以通过它提交这个时钟。 在生产的默认情况下,将使用 Clock.systemDefaultZone() 或类似的。

然后在您的情况下,您不会使用 System.currentTimeMillis() 而是 clock.millis() ,您可以从测试中轻松管理它。

PS:我还不熟悉最新的 JUnit 版本,但我想我读过一些东西,在那里你甚至可以模拟 static 方法。 也许这是需要调查的事情,但我还没有给出任何保证。

使用 Mockito 无法实现此目的,因为这需要 static 方法的 mocking 方法,而 ZE4E4337B7330BC76AAC 不支持该方法

作为一种可能的解决方案,您可以尝试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM