1. Обзор
В этой статье мы рассмотрим, как мы можем проверить, что объект относится к определенному типу. Мы рассмотрим различные библиотеки тестирования и методы, которые они предлагают для утверждения типа объекта.
Сценарий, в котором нам может понадобиться это сделать, может быть разным. Распространенным является случай, когда мы используем интерфейс в качестве возвращаемого типа метода, но затем, в зависимости от возвращаемого конкретного объекта, мы хотим выполнять разные операции. Модульные тесты могут помочь нам определить , имеет ли возвращаемый объект тот класс, который мы ожидаем.
2. Пример сценария
Давайте представим, что мы сортируем деревья по тому, сбрасывают ли они листья за зиму или нет. У нас есть два класса, Evergreen
и Deciduous,
оба реализуют интерфейс Tree
.
У нас есть простой сортировщик, который возвращает правильный тип в соответствии с именем дерева:
Tree sortTree(String name) {
List<String> deciduous = List.of("Beech", "Birch", "Ash", "Whitebeam", "Hornbeam", "Hazel & Willow");
List<String> evergreen = List.of("Cedar", "Holly", "Laurel", "Olive", "Pine");
if (deciduous.contains(name)) {
return new Deciduous(name);
} else if (evergreen.contains(name)) {
return new Evergreen(name);
} else {
throw new RuntimeException("Tree could not be classified");
}
}
Давайте рассмотрим, как мы можем проверить, какой тип дерева
фактически возвращается.
2.1. Тестирование с помощью JUnit5
Если мы хотим использовать JUnit5 , мы можем проверить, равен ли класс нашего объекта классу, который мы тестируем, используя метод assertEquals
:
@Test
public void sortTreeShouldReturnEvergreen_WhenPineIsPassed() {
Tree tree = tested.sortTree("Pine");
assertEquals(tree.getClass(), Evergreen.class);
}
2.2. Тестирование с помощью Hamcrest
При использовании библиотеки Hamcrest мы можем использовать методы assertThat и instanceOf
:
@Test
public void sortTreeShouldReturnEvergreen_WhenPineIsPassed() {
Tree tree = tested.sortTree("Pine");
assertThat(tree, instanceOf(Evergreen.class));
}
При импорте с помощью org.hamcrest.Matchers.isA
нам доступна сокращенная версия :
assertThat(tree, isA(Evergreen.class));
2.3. Тестирование с помощью AssertJ
Мы также можем использовать метод isExactlyInstanceOf библиотеки AssertJ
Core : ``
@Test
public void sortTreeShouldReturnEvergreen_WhenPineIsPassed() {
Tree tree = tested.sortTree("Pine");
assertThat(tree).isExactlyInstanceOf(Evergreen.class);
}
Другой способ выполнить тот же тест — использовать метод hasSameClassAs
:
@Test
public void sortTreeShouldReturnDecidious_WhenBirchIsPassed() {
Tree tree = tested.sortTree("Birch");
assertThat(tree).hasSameClassAs(new Deciduous("Birch"));
}
3. Заключение
В этом руководстве мы рассмотрели несколько различных примеров проверки типа объекта в модульных тестах. Мы показали простой пример Junit5
, а также методы библиотек Hamcrest
и AssertJ
. И Hamcrest,
и AssertJ
предлагают дополнительную полезную информацию в своих сообщениях об ошибках.
Как всегда, код этого примера доступен на GitHub .