Каждую проверку, которую мы написали для метода StringUtils.capitalize()
, в тестировании принято называть утверждением (assert). Утверждения — ключевая часть тестов. Именно они проверяют работу кода:
// Первое утверждение (проверка на пустую строку)
if (!"".equals(StringUtils.capitalize(""))) {
throw new AssertionError("Метод работает неверно!");
}
// Второе утверждение (проверка на слово)
if (!"Hello".equals(StringUtils.capitalize("hello"))) {
throw new AssertionError("Метод работает неверно!");
}
Можно заметить, что все проверки строятся одинаковым способом: условие => исключение. Java, начиная с версии 1.4., поддерживает ключевое слово assert, которое предназначено для проверки утверждений:
// Проверка сменилась с отрицательной на положительную
// Утверждение считается пройденным, если условие истинно
assert 4 == 2 + 2;
assert "".equals(StringUtils.capitalize(""));
// Опциональное сообщение об ошибке
// Указывается после двоеточия
assert "Hello".equals(StringUtils.capitalize("hello")) : "Ваш метод не работает!";
Синтаксис достаточно прост:
- указываем ключевое слово assert,
- пишем выражение или вызываем метод, результатом которого будет булево выражение (
true
илиfalse
), - опционально: после двоеточия можем указать некоторое строковое сообщение, которое будет передано вместе с ошибкой. В общем случае может быть не просто строка, а любое выражение, которое возвращает что-то отличное от
void
.
В случае если значение после ключевого слова assert будет равно false
, то возникнет ошибка (будет выброшено AssertionError
). Другими словами, assert true
означает что всё хорошо, а assert false
говорит об ошибке. Например, если в последнем примере метод StringUtils.capitalize("hello")
вернёт что-то отличное от Hello, то мы увидим в консоли вот такое сообщение:
java.lang.AssertionError: Ваш метод не работает!
at io.hexlet.LessonTest.testMain(LessonTest.java:12)
...
В первой строке мы видим какое исключение было проброшено (java.lang.AssertionError
) и сообщение, которое мы передали вместе с ним. Кроме сообщения, выводится бектрейс, по которому можно найти сработавшее утверждение. В данном случае необходимо изучать код на 12 строке в классе io.hexlet.LessonTest
.
Использование ключевого слова assert
сделало наш код короче и проще для восприятия. Положительная проверка смотрится естественнее, так как это то, что мы ожидаем.
Однако, ключевое слово assert было введено только в Java 1.4., это значит что в предыдущих версиях Java вполне можно было создать переменную или метод с именем assert. Программы в которых использовались такие имена могли стать неработоспособными после введения нового ключевого слова. Для сохранения обратной совместимости было принято решение, что по умолчанию механизм использования assert будет отключен. Если нужно чтобы ваши assert срабатывали, то при запуске программы указывается аргумент командной строки -enableassertions
(-ea
).
Рассмотрим пример. Допустим у нас есть вот такой класс:
class HelloWorld {
public static void main(String[] args) {
assert 1 == 2; // заведомо ложное утверждение
System.out.println("Hello world");
}
}
Если мы его скомпилируем и запустим без дополнительных аргументов, то мы увидим на экране текст Hello world, несмотря на то, что 1 точно не равно 2. Чтобы включить assert нам необходимо сделать так:
java -ea HelloWorld.java
# Boom!
Тогда в консоли вместо надписи Hello world мы увидим сообщение об ошибке:
Exception in thread "main" java.lang.AssertionError
at HelloWorld.main(HelloWorld.java:4)
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.