Перейти к основному содержимому

Утверждают, что объект относится к определенному типу

· 3 мин. чтения

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 .