我正在尝试通过我的数据库测试缓存的异步加载。我正在使用 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/