Модульное тестирование внутреннего состояния структуры данных

У меня есть задача создать реализации для большого количества метрических структур данных (, а именно quadtree и k -d-дерева вариантов ). У меня есть около четырех таких реализаций, но то, как я сейчас тестирую, не является хорошим, за неимением лучшего слова.

Мне нужен простой способ проверки вставки и удаления данных из этих древовидных/древовидных структур таким образом, чтобы я мог тестировать внутренние структуры узлов (, проверяя родителей, потомков, порядок и т. д. ). Эти реализации следуют отдельным проверкам правильности и анализу во время выполнения, поэтому мне нужно убедиться, что узел не только вставлен правильно (, что означает, что его можно будет извлечь из дерева позже ), но также и в очень "правильном" положении в дерево.

Однако «модульное тестирование» кажется неправильным способом сделать это, поскольку его цель, если я не ошибаюсь, состоит в том, чтобы протестировать структуру или внешний API системы. Я видел много вопросов, связанных с модульным -тестированием, в которых задавались вопросы «как мне получить доступ к частному полю в модульном тесте» или «как мне проверить возвращаемые значения не -общедоступного метода», и ответ таков: обычно «не надо» -, и я согласен с этим ответом.

И поэтому я не оставляю никого, кто хотел бы помочь, просто расплывчатыми фразами, интерфейс, реализуемый моими деревьями, следующий (, основанный на интерфейсе карты java-коллекции):

public interface SpatialMap extends Iterable>
{
// Query Operations

/**
 * Returns the number of key-value mappings in this map. If the map contains more than
 * Integer.MAX_VALUE elements, returns Integer.MAX_VALUE.
 * 
 * @return The number of key-value mappings in this map.
 */
int size();

/**
 * Returns true if this map contains no key-value mappings.
 * 
 * @return true if this map contains no key-value mappings.
 */
boolean isEmpty();

/**
 * Returns true if this map contains a mapping for the specified key.
 * 
 * @param key
 *            The key whose presence in this map is to be tested.
 * @return true if this map contains a mapping for the specified key.
 */
boolean containsKey(K key);

/**
 * Returns the value to which the specified key is mapped, or {@code null} if this map contains
 * no mapping for the key.
 * 
 * 

A return value of {@code null} does not necessarily indicate that the map contains * no mapping for the key; it's also possible that the map explicitly maps the key to * {@code null}. The {@link #containsKey containsKey} operation may be used to distinguish these * two cases. * * @see #put(Comparable, Comparable, Object) * * @param key * The key whose associated value is to be returned. * @return The value to which the specified key is mapped, or {@code null} if this map contains * no mapping for the key. */ V get(K key); // Modification Operations /** * Associates the specified value with the specified key in this map. If the map previously * contained a mapping for the key, the old value is replaced. * * @param key * The key with which the specified value is to be associated. * @param data * The value to be associated with the specified key. * @return The previous value associated with the key, or null if there was no mapping * for the key. (A null return can also indicate that the map previously * associated null with key.) */ V put(K key, V data); /** * Removes the mapping for the specified key from this map if present. * * @param key * The key whose mapping is to be removed from the map. * @return The previous value associated with the key, or null if there was no mapping * for the key. (A null return can also indicate that the map previously * associated null with key.) */ V remove(K key); // Bulk Operations /** * Removes all of the mappings from this map. The map will be empty after this call returns. */ void clear(); }

Это затрудняет тестирование только общедоступных методов, поскольку мне нужны определенные данные (дочерние/родительские указатели ), которые недоступны из общедоступного интерфейса. Кроме того, в структурах дерева (PR Quadtree, PRKDTree, варианты MX и т. д. )есть узлы, которые отделены от данных,поэтому создание общедоступного метода, который возвращает «узел», также будет слишком абстрагироваться, чтобы получить правильные данные.

Какой метод тестирования (или методы, которые я мог бы использовать с JUnit и не чувствовать, что разрушаю красивые когнитивные границы ), я ищу?

8
задан efritz 2 July 2012 в 00:57
поделиться