14

我有一个 Map 接口的自定义实现,它做了一些花哨的事情,比如对函数的惰性求值。从外部构造后,实现应该看起来不可变(例如,不支持 put() 和 putAll() 方法)

我看起来它在最基本的条件下工作。由于它非常复杂,我相信一定有大量潜伏在线程安全、不规则操作顺序等方面的错误。

由于 Map 接口的契约是明确定义的,我确信必须存在一个通用测试集合来检查极端情况、线程安全等。

我听说 Google Collections 为他们的库运行了大约 25000 个单元测试。是否可以在某处下载它们?

4

2 回答 2

7

Google Collections zip 包含他们的测试。里面应该有一个 google-collect-testfw jar。

具体来说,对 Map 的总合约有一个抽象测试。

于 2009-05-14T17:34:33.670 回答
0

您可能想看看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是一个很好的建议。

于 2009-05-14T18:17:34.813 回答