Я хотел написать этот короткий пост, чтобы выделить функцию assertFailsWith, доступную для Kotlin. Эта функция немного упрощает тестирование исключений. Тестирование исключений не является чем-то необычным или новым для языков JVM (с этого момента я буду использовать Java для сравнений). Kotlin имеет приятное дополнительное преимущество, предоставляя эту функциональность как часть своей стандартной библиотеки. Сравнивая это с Java, вы, вероятно, добавите AssertJ для достижения аналогичных результатов.

Основная цель этого поста - познакомить вас с функцией assertFailsWith. Я лично не знал, что он существует какое-то время и по умолчанию зависел от AssertJ. Не то чтобы я что-то имел против AssertJ, то есть. Есть много других функций, которые предоставляет библиотека. В этом конкретном случае его можно удалить (при условии, что вы не используете его ни для чего другого).

Чем хорош assertFailsWith и AssertJ в целом? Он обеспечивает лучшее тестирование исключений, чем простые конструкции, предоставляемые JUnit. Точнее, он позволяет вам указать, в какой части вашего теста вы ожидаете выброса исключения, вместо того, чтобы объявлять, что исключение возникнет где-то в коде. Это может привести к тому, что исключения будут неправильно обработаны тестом в неправильном месте и заставят вас думать, что они работают так, как вы думаете.

Теперь у меня есть это краткое замечание, давайте перейдем к основному содержанию этого поста. Ниже показано, как assertFailsWith выглядит внутри теста:

В этом примере hereIsAnException помещается в тело assertFailsWith, который проверяет, выброшено ли IllegalArgumentException. Если он не поднимается, утверждение не будет выполнено. Если это произойдет, то утверждение пройдет, и исключение будет перехвачено.

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

Например, является ли это оболочкой для другого исключения (каков тип его свойства cause)?

Является ли сообщение тем, чего вы ожидаете (не самым надежным из проверок)?

Будут обнаружены только исключения того же типа или подтипа, который указан в assertFailsWith. Любые другие вызовут неудачу теста. Так как он улавливает подтипы, не указывайте просто Exception или RuntimeException. Постарайтесь быть точными, чтобы ваши тесты были максимально полезными.

Как упоминалось ранее, assertFailsWith будет перехватывать только исключение, которое генерируется в теле функции. Поэтому, если бы вместо этого было написано:

Тест не пройдёт. hereIsAnException вызвал исключение, которое не было перехвачено и привело к сбою теста. Я считаю, что это лучшая часть подобной функции по сравнению с предыдущими способами выполнения (например, утверждение внутри @Test, что произойдет исключение).

Я лично никогда не использовал в утверждении часть сообщения. Может быть, да, так что я подумал, что хотя бы дам тебе знать.

Прежде чем я завершу небольшой объем контента в этом посте, давайте быстро взглянем на AssertJ, чтобы мы могли провести сравнение между ними. Опять же, это только для случая перехвата исключений, что является лишь небольшой частью того, что предоставляет AssertJ.

Это немного более «многословно», чем версия assertFailsWith. Но это компенсируется множеством функций, которые предоставляет AssertJ, что значительно упрощает дальнейшую проверку возвращаемого исключения. Точнее, при использовании assertFailsWith мне нужно было написать еще одно утверждение, чтобы проверить сообщение. В AssertJ это просто функция, привязанная к концу предыдущего вызова.

В заключение, assertFailsWith - прекрасная маленькая функция, которую можно использовать при тестировании, чтобы убедиться, что фрагмент кода генерирует исключение определенного типа. Он встроен в стандартную библиотеку Kotlin, что избавляет от необходимости вносить дополнительную зависимость в ваш проект. При этом это относительно простая функция, которая не дает той функциональности, которую имела бы такая библиотека, как AssertJ. Скорее всего, этого будет достаточно, пока вы не захотите писать тесты, содержащие широкий диапазон утверждений, так как это тот момент, когда это может стать беспорядочным.

Официальную документацию для assertFailsWith можно найти здесь, если вас интересует Kotlin Docs - assertFailsWith.

Если вы нашли этот пост полезным, вы можете подписаться на меня в Твиттере по адресу @LankyDanDev, чтобы быть в курсе моих новых постов.

Просмотреть все сообщения Дэна Ньютона

Первоначально опубликовано на lankydanblog.com 26 января 2019 г.