Модульное тестирование экземпляра итерабельного

#java #unit-testing #junit

#java #модульное тестирование #junit

Вопрос:

Я разрабатываю тестовый пример Junit 4 (черный ящик) для следующего метода:

 /**
* Returns all points in the symbol table.
*/
public Iterable<Point2D> points();
 

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

 @Test
public void emptySTPointsTest() {
    KdTreeST<Integer> kd = new KdTreeST<>();      // initializing empty ST
    Iterable<Point2D> pts = kd.points();      // arbitrary decision

    assertFalse(pts.iterator().hasNext());        // ?!
}
 

Существуют ли другие способы проверить, является ли экземпляр итерируемого (не) пустым? Каков «правильный» (или наиболее распространенный) способ реализации такого рода модульных тестов, когда вы не можете явно проверить количество элементов и не знаете, в каком порядке они входят (не только пустой регистр, но и вообще)?

P.S Я пытался использовать сопоставители Hamcrest, однако в интерфейсе Iterable не указан size() метод, поэтому я думаю, что в этом случае это было бы не так полезно.

Редактировать: вместо Iterable<Point2D> pts = new HashSet<>(); того, чтобы я должен был написать Iterable<Point2D> pts = kd.points();

Комментарии:

1. в чем смысл модульного тестирования черного ящика в этом случае?

2. @Lashane Я пытался сказать, что я заранее не знаю, какая реализация Iterable возвращается: я не могу проверить метод, единственное, что у меня есть, это спецификация для метода.

Ответ №1:

Ваш метод в порядке; в нем нет ничего плохого. Как следует из другого ответа, вы тестируете итератор, полученный из HashSet, а не из KdTreeST .

Кроме того, для вашей ситуации есть сопоставитель Hamcrest.

 assertThat(pts.iterator(), is(emptyIterable()));
 

(при условии, что вы статически импортируете из org.hamcrest.Matchers )

Ответ №2:

Модульный тест, который вы написали, — это модульное тестирование класса HashSet (в частности, поведение HashSet#iterator() , когда набор пуст). Это не тестирование вашего points метода.

Однако, чтобы ответить на ваш вопрос о пустых итерациях… похоже, что это, безусловно, один из способов проверки пустого итерируемого. Итеративный интерфейс имеет только один метод: iterator .

Возможно, объявление points для возврата Iterable слишком абстрактно для ваших нужд. Почему бы не увеличить его до Collection<Point2D> ? Таким образом, вы можете использовать Collection#isEmpty() , который легче читать.

Комментарии:

1. Вы правы, я как-то упустил из виду, что на самом деле я тестировал экземпляр метода HashSet instead of calling points() . Спасибо.