Общий тестовый жгут для java.util.Map? - PullRequest
14 голосов
/ 14 мая 2009

У меня есть пользовательская реализация интерфейса Map, которая делает некоторые полезные вещи, такие как ленивая оценка функций. реализация должна выглядеть неизменной после построения извне (например, методы put () и putAll () не поддерживаются)

Я, похоже, работает в самых основных условиях. Поскольку он довольно сложный, я уверен, что в нем много скрытых ошибок с безопасностью потоков, неправильным порядком операций и многим другим.

Поскольку контракт интерфейса Map четко определен, я уверен, что должен существовать общий набор тестов, который проверяет угловые случаи, безопасность потоков и т. Д.

Я слышал, что Google Collections выполняет около 25000 модульных тестов для своей библиотеки. Можно ли их где-то скачать?

Ответы [ 2 ]

7 голосов
/ 14 мая 2009

В архиве Google Collections содержатся их тесты. Там должен быть google-collect-testfw jar.

В частности, есть абстрактный тест для генерального контракта Map.

0 голосов
/ 14 мая 2009

Возможно, вы захотите узнать, есть ли в 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) с ранее невидимым ключом изменит то, что видит Map.entrySet()

Если вам нужно написать собственную реализацию Map и вы хотите найти хорошее место для начала своих тестов, то предложение Адама об использовании MapInterfaceTest из Google Collections является хорошим.

...