[英]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.