Вторая часть нашей статьи о тестировании приложений с помощью JUnit5 и EasyMock. На этот раз мы рассмотрим лучшие практики JUnit, создание объектов EasyMock.

Лучшие практики JUnit: создание объектов EasyMock

Вот полезный совет по методу createMock. Если вы проверите API EasyMock, вы увидите, что метод createMock поставляется с многочисленными сигнатурами. Подпись, которую мы используем:

Какой из них мы должны использовать? createMock(String name, Class claz) лучше. Если вы используете createMock(Class claz) и ваши ожидания не оправдались, вы получите следующее сообщение об ошибке:

Как видите, это сообщение не такое описательное, как хотелось бы. Если вместо этого вы используете createMock(String name, Class claz) и сопоставляете класс с заданным именем, мы получаем что-то вроде следующего:

Фрагмент кода из листинга 6 открывает HTTP-соединение с заданным URL-адресом и считывает содержимое по этому URL-адресу. Предположим, что этот код является одним из методов более крупного приложения, которое вы хотите протестировать.

Листинг 6. Класс WebClient

В этом списке:

  • Открываем HTTP-соединение (1)
  • Читаем весь полученный контент (2)
  • Если возникает ошибка, мы возвращаем null (3)

Мы хотим протестировать метод getContent в WebClient. Для этого нам нужно имитировать все зависимости от этого метода. В этом примере у нас есть две зависимости: одна — это ConnectionFactory, а другая — InputStream. Похоже, есть проблема, потому что EasyMock может только имитировать интерфейсы, а InputStream — это класс.

Чтобы иметь возможность имитировать класс InputStream, нам нужно использовать расширения класса EasyMock. Они представляют собой проект расширения EasyMock, который позволяет создавать фиктивные объекты для классов и интерфейсов. К ним обращается вторая зависимость Maven из листинга 1.

Листинг 7. Тестирование WebClient с помощью EasyMock

В листинге 7 делаем следующее:

  1. Начнем с импорта нужных нам объектов (1). Обратите внимание: поскольку мы используем расширения классов EasyMock, теперь нам нужно импортировать объект org.easymock.classextension.EasyMock вместо org.easymock.EasyMock. Теперь мы готовы создавать фиктивные объекты классов и интерфейсов, используя статически импортированные методы расширений класса.
  2. В (2), как и в предыдущих листингах, мы объявляем объекты, которые мы хотим имитировать, а в (3) мы вызываем метод createMock для их инициализации.
  3. В (4) мы определяем ожидание потока при вызове метода чтения (обратите внимание, что для остановки чтения из потока последним возвращается значение -1). Работая с низкоуровневым потоком, мы определяем, как читать по одному байту за раз, поскольку InputStream считывает байт за байтом. В (5) мы ожидаем, что метод close будет вызываться для потока.
  4. Теперь нам нужно обозначить, что мы закончили, объявив наши ожидания — мы делаем это, вызывая метод replay (6). Метод replay используется для передачи макета из фазы, где мы записываем метод, который, как мы ожидаем, будет вызван, туда, где мы тестируем. До этого мы записывали поведение, но объект не работает как мокап. После вызова replay все работает как положено. Остальное вызывает тестируемый метод (7) и утверждает ожидаемый результат (8).

Мы также добавляем еще один тест для имитации состояния, когда мы не можем закрыть InputStream.

  1. Мы определяем ожидание, когда мы ожидаем, что будет вызван метод закрытия потока (9).
  2. Прямо в следующей строке мы объявляем, что при возникновении этого вызова должно быть возбуждено исключение IOException (10).

Выводы

В этой статье продемонстрированы шаги, необходимые для тестирования приложения Java с помощью JUnit 5 и EasyMock. Мы показали, как тестировать функциональность AccountService, имитируя AccountManager, и WebClient, имитируя ConnectionFactory. и InputStream.

Как следует из названия фреймворка, использовать EasyMock легко, и это вариант для многих проектов, но чтобы вы знали всю картину насмешек, нам нужно представить еще один фреймворк, имитирующий части службы учетной записи и веб-клиента. с использованием трех разных фреймворков: EasyMock, JMock и Mockito. Таким образом, у вас будет лучшее представление о том, как работает насмешка.

Заинтересованы в JUnit? Посетите наши тренинги.

Каталин Тудоуз
Эксперт по Java и веб-технологиям

Первоначально опубликовано на https://www.luxoft-training.com.