Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在测试类中模拟System.currentTimeMillis?_Java_Mockito - Fatal编程技术网

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

Java 如何在测试类中模拟System.currentTimeMillis?,java,mockito,Java,Mockito,我试图模拟我的getParams(),原因是System.currentTimeMillis() 但是,如果您有更好的解决方案,我们欢迎您。我不知道这是否是首选方法,但是我们有一个java.time.Clock的测试实现,测试中的类提供了一个包私有构造函数,您可以通过它交上这个时钟。在生产的默认情况下,将使用Clock.systemDefaultZone()或类似文件 那么,在您的情况下,您不会使用System.currentTimeMillis(),而是使用clock.millis(),您可以

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


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

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

那么,在您的情况下,您不会使用System.currentTimeMillis(),而是使用clock.millis(),您可以通过测试轻松管理它


PS:我还不熟悉最新的JUnit版本,但我想我读到了一些东西,在那里你甚至可以模拟静态方法。也许这是需要研究的问题,但我还没有给出任何保证。

使用Mockito无法实现这一点,因为这需要模拟静态方法,Mockito不支持这种方法

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

  • 按照建议使用PowerMockito
  • 抑制静态方法调用并传递可以用Mockito模拟的内容
  • 如果不需要精度,可以使用或

如果需要使用其他时间,则首先不应硬编码当前时间。重构代码,使时间成为该方法的一个参数。您可能希望查看这个线程“7000-10天”,它似乎比10天略短,只有7秒。@pxcv7r问题是,服务和测试的时间都应该是相同的:最近的Mockito版本。

    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