我有一个 Map 接口的自定义实现,它做了一些花哨的事情,比如对函数的惰性求值。从外部构造后,实现应该看起来不可变(例如,不支持 put() 和 putAll() 方法)
我看起来它在最基本的条件下工作。由于它非常复杂,我相信一定有大量潜伏在线程安全、不规则操作顺序等方面的错误。
由于 Map 接口的契约是明确定义的,我确信必须存在一个通用测试集合来检查极端情况、线程安全等。
我听说 Google Collections 为他们的库运行了大约 25000 个单元测试。是否可以在某处下载它们?
我有一个 Map 接口的自定义实现,它做了一些花哨的事情,比如对函数的惰性求值。从外部构造后,实现应该看起来不可变(例如,不支持 put() 和 putAll() 方法)
我看起来它在最基本的条件下工作。由于它非常复杂,我相信一定有大量潜伏在线程安全、不规则操作顺序等方面的错误。
由于 Map 接口的契约是明确定义的,我确信必须存在一个通用测试集合来检查极端情况、线程安全等。
我听说 Google Collections 为他们的库运行了大约 25000 个单元测试。是否可以在某处下载它们?
Google Collections zip 包含他们的测试。里面应该有一个 google-collect-testfw jar。
您可能想看看Google Collections是否有满足您需求的东西,这样您就不必支持自己的地图。例如,参见MapMaker
private Map<Key, Graph> createMap() {
ConcurrentMap<Key, Graph> graphs = new MapMaker()
.concurrencyLevel(32)
.softKeys()
.weakValues()
.expiration(30, TimeUnit.MINUTES)
.makeComputingMap(
new Function<Key, Graph>() {
public Graph apply(Key key) {
return createExpensiveGraph(key);
}
});
return Collections.unmodifiableMap(graphs);
}
请注意,地图在构建后不会显得完全不可变,因为map.get(key)使用以前看不见的键执行 a 会改变所看到的内容Map.entrySet()
如果您需要编写自定义 Map 实现并希望从一个好地方开始您的测试,Adam 建议使用 Google Collections 的MapInterfaceTest是一个很好的建议。