Java 如何在测试类中模拟System.currentTimeMillis?
我试图模拟我的getParams(),原因是System.currentTimeMillis()Java 如何在测试类中模拟System.currentTimeMillis?,java,mockito,Java,Mockito,我试图模拟我的getParams(),原因是System.currentTimeMillis() 但是,如果您有更好的解决方案,我们欢迎您。我不知道这是否是首选方法,但是我们有一个java.time.Clock的测试实现,测试中的类提供了一个包私有构造函数,您可以通过它交上这个时钟。在生产的默认情况下,将使用Clock.systemDefaultZone()或类似文件 那么,在您的情况下,您不会使用System.currentTimeMillis(),而是使用clock.millis(),您可以
但是,如果您有更好的解决方案,我们欢迎您。我不知道这是否是首选方法,但是我们有一个java.time.Clock的测试实现,测试中的类提供了一个包私有构造函数,您可以通过它交上这个时钟。在生产的默认情况下,将使用Clock.systemDefaultZone()或类似文件 那么,在您的情况下,您不会使用System.currentTimeMillis(),而是使用clock.millis(),您可以通过测试轻松管理它
PS:我还不熟悉最新的JUnit版本,但我想我读到了一些东西,在那里你甚至可以模拟静态方法。也许这是需要研究的问题,但我还没有给出任何保证。使用Mockito无法实现这一点,因为这需要模拟静态方法,Mockito不支持这种方法 作为可能的解决方案,您可以尝试
- 按照建议使用PowerMockito
- 抑制静态方法调用并传递可以用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