4

您将如何对 Java 中的安全发布保证进行单元测试?

具体来说:

我有一个 Cache 接口,它有一个方法 getOrLoad(K key, ObjectLoader loader)。问题是,如果缓存找不到给定键的对象,那么它必须从 ObjectLoader 实例加载它。但是,缓存需要保证从加载器加载对象并将其放入缓存中的行为构成安全发布。

我现在正在为此 Cache 接口编写一个通用的 junit 测试,我想知道如何测试 Cache 实现是否遵守这个安全发布保证。

有任何想法吗?实际代码位于代码存储库的 test-systest 模块部分,以防您想要查看真实文件。

4

3 回答 3

1

也许您可以使用ConTest至少让您更加确信您的代码是正确的。

您需要实现几个同时运行多个线程的测试。然后,ConTest 将增加通过检测字节码(添加启发式控制的条件睡眠和产生指令)实际揭示并发错误的可能性。

于 2008-10-14T15:59:32.227 回答
1

我发现了Bill Pugh、Brian Goetz 和 Cliff Click 关于测试并发代码主题的JavaOne 演示。他们建议了这种方法,我认为这是我听过的最好的方法:

许多生产者使用状态相关的 hashCode 实现创建有状态和线程不安全的对象。当对象通过假定的同步点发送时,hashCodes 被总结(线程本地)。同样,门另一边的消费者对 hashCode 进行总结。

在测试结束时,我们分别总结了生产者和消费者的所有结果。如果两个和相等,则测试通过。

我们也可以使用 XOR 作为 sum 的替代方案。事实上,任何交换运算都可以。请记住,测试工具本身不得引入任何额外的同步。

于 2008-10-14T19:13:26.313 回答
0

实际上由于不安全的发布而出错是非常困难的(如果有人知道怎么做,请告诉我)。静态分析是自动化解决方案的最佳选择。我会坚持代码审查,而不是过度担心它。

于 2008-10-14T13:29:42.653 回答