编写Guava Loading Cache的测试用例

3
我正在尝试测试数据库缓存的异步加载。 我正在使用Google Guava加载缓存,该缓存会异步刷新给定的键(如https://code.google.com/p/guava-libraries/wiki/CachesExplained中所述)。
我尝试以下步骤进行测试:
- 刷新持续时间:1秒 - 调用缓存,键不存在。 执行对模拟数据库的调用。 - Thread.sleep(2000L) - 为相同的键再次进行调用。由于键已存在且刷新期已过,应返回旧值并启动异步刷新。 - Thread.sleep(2000L) - 为相同的键再次进行调用。
由于我正在模拟dao,因此我希望它至少被调用两次。但是,当我尝试验证模拟时,它不能成功,并显示模拟仅被调用了一次。 如何确保已调用dao两次? 在创建Executor时,我模拟了Thread Factory,因此可以调用以创建新线程,这是预期的。为什么不会进行第二次dao调用? 我正在使用new FixedThreadPool executor并将其装饰为listening decorator。测试这样的刷新缓存的正确方法是什么?非常感谢您的任何帮助。

新的维基位置:https://github.com/google/guava/wiki/CachesExplained - descript
1个回答

7

使用

CacheBuilder.ticker(youtTicker)

并且传递一个 FakeTicker 以便随意推进时间。

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

查看例如 CacheRefreshTest 的源代码。

也许通过简化你的测试可以发现问题……这就是我在没有你的确切代码的情况下所能说的全部。


感谢您的回复,maaartinus。根据CacheBuilder的文档,当测试配置了expireAfter*的缓存时,ticker非常有用。然而,我的缓存是配置了refreshAfterWrite,不确定Ticker是否有用。无论如何,我会尝试一下。 - u07103
@u07103 我敢打赌,股票代码是给定缓存中唯一使用的时间源。其他任何事情都是愚蠢的。我猜文档只提到“过期”是因为“刷新”是一个较新的功能。 - maaartinus
@u07103 创建了 Issue 1836 - maaartinus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接