具体:
我有一个Cache接口,它有一个getOrLoad方法(K键,ObjectLoader加载器)。事实是,如果Cache无法找到给定键的对象,那么它必须从ObjectLoader实例加载它。但是,需要Cache来保证从加载器加载对象并将其放入Cache中的行为构成一个安全的出版物。
我现在正在为这个Cache接口编写一个通用的junit测试,我想知道如何测试Cache实现是否遵循这个安全的发布保证。
有什么想法吗?如果您想要查看真实文件,实际代码位于code repository的test-systest模块部分。
答案 0 :(得分:1)
也许您可以使用ConTest至少让您更加确信您的代码是正确的。
您需要实现几个同时运行多个线程的测试。然后,ConTest将通过检测字节代码来增加实际显示并发错误的可能性(添加启发式控制的条件睡眠和产生指令)。
答案 1 :(得分:1)
我发现了Bill Pugh,Brian Goetz和Cliff的JavaOne presentation点击测试并发代码的主题。他们提出了这种方法,我认为这是我听过的最好的方法:
许多生成器使用依赖于状态的hashCode实现创建有状态和线程不安全的对象。当对象通过假定的同步点发送时,hashCodes被总结(线程本地)。同样,门的另一侧的消费者总结了hashCodes。
在测试结束时,我们分别总结了生产者和消费者的所有结果。如果两个总和相等,则测试通过。
我们也可以使用XOR作为总和的替代方案。事实上,任何交换操作都可以。请记住,测试工具本身不得引入任何其他同步。
答案 2 :(得分:0)
实际上由于不安全的发布而导致错误是非常困难的(如果有人知道如何,请告诉我)。静态分析是自动化解决方案的最佳选择。我会坚持代码审查,而不是过分担心它。