如何对与时间相关的方法进行单元测试?

How to unit test a time related method?

假设我们有这个接口:

interface CallChecker {
    boolean canCall(String ipAddress, Object method);
}

我们限制每个方法每秒从一个 IP 调用 10 次,即如果一个方法在一秒钟内被调用超过 10 次,CallChecker::canCall(ip, method) 应该 return false。

我们如何对这个函数进行单元测试?

附带问题:是否有更好的方法来定义 method 而不是 Object 类型?

在某些时候,您必须注册各个请求的时间戳,以查看它们 > 1 且跨度小于 1 秒。

在运行时,您将使用系统时钟、Instant.now() 或其他任何东西。在单元测试中,您将手动设置这些时间戳。类似(仅概念):

t0=Instant.now();
for(int i=1;i++;i<=10){
  yourService.handleRequest(request,t0.plusMilis(i*10));
  assertThat(yourSrvice.canMakeRequest).isTrue();
}
  yourService.handleRequest(request,t0.plusMilis(300));
  assertThat(yourSrvice.canMakeRequest).isFalse();

现在你可以随意设置请求时间戳来模拟游戏中时光倒流了。这只是其中一种可能性。