如何对与时间相关的方法进行单元测试?
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();
现在你可以随意设置请求时间戳来模拟游戏中时光倒流了。这只是其中一种可能性。
假设我们有这个接口:
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();
现在你可以随意设置请求时间戳来模拟游戏中时光倒流了。这只是其中一种可能性。