#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 callingpoints()
. Спасибо.