gpt4 book ai didi

java - 如何测试到期条件?

转载 作者:行者123 更新时间:2023-12-01 14:24:42 25 4
gpt4 key购买 nike

我正在开发一个组件,该组件提供的 token 具有有限的生命周期,并且在应用程序重启时无需保留。因此, token 仅存储在内存中。每个 token 都由一个 key 标识,并具有相关联的生存时间,之后 token 将过期并且不能再使用。

我停下来想你会如何测试到期条件是否按计划工作?

  1. 使用 System.currentTimeMillis 的简单实现没有提供注入(inject)任意时间以测试边界的正确方法。
  2. 向适当的方法添加日期时间参数(Calendar、Joda-Time 的 DateTime 等)在测试上下文之外没有意义,因为这不是来电者知道现在几点了。
  3. 将系统时间包装在一个可以注入(inject)和模拟的类中似乎是可行的方法,但感觉有点麻烦。这还需要另一个构造函数作为默认实现,在除测试环境外的所有情况下都足够了。
  4. 将生命周期定义为一个设置将使等待时间足够短,从而使 sleep() 或忙等待成为合理可靠的解决方案

我目前倾向于选项 4,但我也会了解更多选项!

过于简化的潦草场景:

private static final long LIFE_SPAN = 60000;
private Map<T, Long> bestBeforeDates = new HashMap<T, Long>();

public void add(final T key) {
bestBeforeDates.put(key, System.currentTimeMillis() + LIFE_SPAN);
}

public boolean isExpired(final T key) {
// How to make this fail without waiting for x milliseconds
return bestBeforeDates.get(key) < System.currentTimeMillis();
}

最佳答案

选项 3 是最好的 IMO。获取当前时间是一项与任何其他服务一样的服务,IMO。很容易编写一个 Clock 接口(interface),然后适本地伪造它。如果您使用的是体面的 DI 框架,则不需要另一个构造函数 - 只需将系统实现绑定(bind)到 Clock 接口(interface),无需进一步更改。

我已经在很多地方使用过这种方法并且从未后悔过。当然,这取决于您是否已经在其他地方使用依赖项注入(inject) - 如果它是您要注入(inject)的唯一依赖项,那就更麻烦了。

关于java - 如何测试到期条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6895694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com