【问题标题】:Writing test case for Loading Cache guava编写加载缓存番石榴的测试用例
【发布时间】:2014-08-21 03:07:52
【问题描述】:

我正在尝试通过我的数据库测试缓存的异步加载。我正在使用 Google guava 加载缓存,而后者又使用缓存加载器异步刷新给定键(如 https://code.google.com/p/guava-libraries/wiki/CachesExplained 中所述)

我正在尝试以下步骤进行测试

  • 刷新持续时间:1 秒
  • 调用缓存,键不存在。调用模拟数据库
  • Thread.sleep(2000L)
  • 再次调用相同的密钥。由于密钥存在且刷新周期结束,因此应返回旧值并开始异步刷新
  • Thread.sleep(2000L)

  • 再次调用同一个键。

由于我在嘲笑道,我希望它至少被调用两次。但是,当我尝试验证模拟时,它没有说模拟只被调用过一次。如何确保 dao 被调用两次?我正在模拟线程工厂,同时创建被调用以创建新线程的 Executor,正如预期的那样。为什么第二次调用 dao 没有发出?我在这里错过了什么吗?我正在使用新的 FixedThread Pool 执行器并将其装饰为监听装饰器。

测试这种刷新缓存的正确方法是什么?非常感谢任何帮助。

【问题讨论】:

标签: java multithreading spring unit-testing guava


【解决方案1】:

使用

CacheBuilder.ticker(youtTicker)

并通过FakeTicker随意提前时间。

除非您真的想要测试多线程行为,否则忘记线程并同步测试它。

查看源代码,例如CacheRefreshTest

也许您可以通过简化测试来发现问题...如果没有您的确切代码,我只能这么说。

【讨论】:

  • 感谢您的回复 maaartinus。根据 CacheBuilder 的文档,ticker 在测试配置了 expireAfter* 的缓存时很有用。但是,我的缓存配置了 refreshAfterWrite,不确定 Ticker 是否有用。无论如何都要尝试一下。
  • @u07103 我敢打赌,代码是给定缓存中唯一使用的时间源。其他任何事情都是愚蠢的。我猜,文档提到“过期”只是因为“刷新”是一个较新的功能。
  • @u07103 Issue 1836 已创建。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多