У меня есть задача создать реализации для большого количества метрических структур данных (, а именно 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 и не чувствовать, что разрушаю красивые когнитивные границы ), я ищу?