Проверка типа объекта в JUnit: элегантное решение
Быстрый ответ
Если вы хотите подтвердить, что объект является экземпляром конкретного класса, можно воспользоваться таким кодом:
assert obj instanceof MyClass : "У объекта obj кризис самоидентификации: это не MyClass";
В качестве альтернативы можно выполнить динамическую проверку obj
:
assert MyClass.class.isInstance(obj) : "AssertionError: Меня не зовут MyClass, друг!";
Оба этих метода генерируют исключение AssertionError, если объект obj
не подходит под объявленный класс.
Повышение эффективности с помощью методов assertThat и Matchers
Наборы утверждений JUnit могут быть усилены применением Matchers
и assertThat
. Эти методы помогут вам элегантно и стильно проверить принадлежность объектов ко конкретным типам.
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.assertThat;
// ...
@Test
public void fireUpInstanceOfTest() {
assertThat(myObject, instanceOf(MyClass.class));
}
Такой подход позволяет заменить несколько методов assertTrue
или assertEquals
всего одной строкой кода, что добавляет к вашим тестам ещё больше элегантности и эффективности.
JUnit 5: изящество метода assertInstanceOf()
Метод assertInstanceOf()
в JUnit 5 – эта изящность в сочетании с простотой. Он не только проверяет принадлежность объекта к классу, но и возвращает это значение, избавляя от необходимости явного приведения типов.
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
// ...
@Test
void blazeInstanceOfTest() {
assertInstanceOf(MyClass.class, myObject);
}
Когда AssertJ становится главным виртуозом
AssertJ предлагает нам создавать цепочки вызовов, transforming утверждения в нечто напоминающее грациозный танец.
import static org.assertj.core.api.Assertions.assertThat;
// ...
@Test
void sparkAssertJTypeCheck() {
assertThat(myObject).isInstanceOf(MyClass.class);
}
Когда необходимо учесть все тонкости, AssertJ выполнит свою работу на отлично.
Kotlin: лаконичное утверждение
В Kotlin принадлежность объекта к классу выражается очень лаконично. Нет необходимости в приведении типов, как в Java, достаточно просто писать is
.
import kotlin.test.assertTrue
// ...
@Test
fun kotlinRoastsJava() {
assertTrue(myObject is MyClass, "Это не объект класса MyClass")
}
Чтобы Kotlin мог взаимодействовать с JUnit, добавьте в ваш проект файл AssertionsJVM.kt.
Избегайте устаревших методов
Так же, как испорченное молоко, практики программирования могут стать устаревшими. Оставайтесь в курсе новейших технологий и отказывайтесь от устаревших методов, чтобы ваш код всегда оставался актуальным.
Визуализация
Представьте, что у вас есть ящик с игрушками, среди которых имеется конструктор Lego:
Ящик с игрушками: [🧸, 🚗, 🎲, 🧩, **🧱**]
Вы можете использовать утверждение assert, чтобы проверить, что ваш 🧱 действительно является блоком Lego:
assertTrue(toy instanceof LegoBlock);
Таким образом, проверка типа будет представлена в виде:
Если 🧱 (игрушка) идеально сочетается с платформой Lego (🧱🟩):
✅ Да, это Lego! (тип подтверждён)
В противном случае:
❌ Нет, это не то, что нам нужно! (тип не подходит)
Определение истинного типа
Когда необходимо проверить конкретный тип объекта, а не его происхождение, можно использовать:
assertEquals(MyClass.class, myObject.getClass());
Этот метод убеждает нас, что myObject
идентичен MyClass
, исключая лишние сравнения с родственными типами.
Полезные материалы
- Программирование с использованием утверждений — официальное руководство по использованию assert в Java.
- Руководство пользователя JUnit 5 — подробная инструкция по написанию эффективных тестов с использованием JUnit 5.
- Утверждения в Java – GeeksforGeeks — практические примеры использования ключевого слова assert.
- Глава 15. Выражения — детальное руководство по использованию оператора instanceof.
- Приведение типов в Java — понятное руководство по приведению типов в Java, которое пригодится при проверке типов.
- Wildcard'ы (Учебник Java™ > Изучение языка Java > Generics (Updated)) — всё о применении wildcard'ов в дженериках для повышения гибкости работы с подтипами.
- IBM Developer — IBM поможет разобраться в особенностях утверждений в Java.