java - 为 Loading Cache guava 编写测试用例

标签 java multithreading spring unit-testing guava

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

我正在尝试以下步骤来测试

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

  • 再次调用同一键。

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

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

最佳答案

使用

CacheBuilder.ticker(youtTicker)

并传递一个FakeTicker来随意提前时间。

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

查看源代码,例如 CacheRefreshTest .

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

关于java - 为 Loading Cache guava 编写测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25417666/

相关文章:

java - 如何删除 JPanel 对象?

java - EntityManagerFactory + jpadaosupport 的依赖注入(inject)问题

java - 属性上的 Spring @Autowired 和 @Value 不起作用

java - 如何使用 <span> 或任何其他 HTML 标签包装部分文本而不转义新的 HTML 结构?

java - 如何在 java 中打印 zip 文件的压缩速度?

Javafx Platform.runLater 从不运行

java - 交付保证和自动线程发布者/订阅者 c#

c++ - 我可以将 boost::threadpool 用作 'thread-safe queue' 吗?

java - spring boot 中依赖注入(inject)失败,基于 maven 的多模块项目

java.sql.SQLRecoverableException - 从 jdbc 重新连接