Изучаем Java EE 7 - [49]

Шрифт
Интервал

Как мы теперь можем протестировать ограничения, налагаемые на наши компоненты? Мы ведь не можем писать модульные тесты для @Email, так как это аннотация, агрегирующая ограничения, равно как и для @ZipCode, которое может работать только для внедрения (а это контейнерная служба). Проще всего будет написать интеграционный тест, то есть использовать фабрику ValidatorFactory для получения Validator, а потом валидировать наши компоненты.

В листинге 3.28 показан класс CustomerIT, выполняющий интеграционное тестирование компонента Customer. Метод инициализирует Validator (с помощью ValidatorFactory), а метод close() высвобождает фабрику. Класс далее содержит два теста: в одном создается валидный объект Customer, а в другом создается объект с недопустимым адресом электронной почты и проверяется, окончится ли валидация ошибкой.


Листинг 3.28. Интеграционный тест CustomerIT

>public class CustomerIT {

>··private static ValidatorFactory vf;

>··private static Validator validator;

>··@BeforeClass

>··public static void init() {

>····vf = Validation.buildDefaultValidatorFactory();

>····validator = vf.getValidator();

>··}

>··@AfterClass

>··public static void close() {

>····vf.close();

>··}

>··@Test

>··public void shouldRaiseNoConstraintViolation() {

>····Customer customer = new Customer("John", "Smith", "[email protected]");

>····Set> violations = validator.validate(customer);

>····assertEquals(0, violations.size());

>··}

>··@Test

>··public void shouldRaiseConstraintViolationCauseInvalidEmail() {

>····Customer customer = new Customer("Джон", "Смит", "DummyEmail");

>····Set> violations = validator.validate(customer);

>····assertEquals(1, violations.size());

>····assertEquals("invalid email address", violations.iterator(). next(). getMessage());

>····assertEquals("dummy", violations.iterator(). next(). getInvalidValue());

>····assertEquals("{org.agoncal.book.javaee7.chapter03.Email.message}",

>·················violations.iterator(). next(). getMessageTemplate());

>··}

>}

Листинг 3.29 построен по такому же принципу (Validator создается с помощью фабрики, происходит валидация компонента, фабрика закрывается), но проверяет компонент Address.


Листинг 3.29. Интеграционный тест AddressIT

>public class AddressIT {

>··@Test

>··public void shouldRaiseConstraintViolationCauseInvalidZipCode() {

>····ValidatorFactory vf = Validation.buildDefaultValidatorFactory();

>····Validator validator = vf.getValidator();

>····Address address = new Address("233 Стрит", "Нью-Йорк", "NY", 

>"DummyZip", "США");

>····Set> violations = 

>validator.validate(address);

>····assertEquals(1, violations.size());

>····vf.close();

>··}

>}

Компиляция и тестирование в Maven

Прежде чем протестировать все классы, их необходимо скомпилировать. Файл pom.xml в листинге 3.20 объявляет все зависимости, требуемые для компиляции кода: Hibernate Validator (справочная реализация Bean Validation) и Weld (для CDI). Обратите внимание: в pom.xml также объявляется плагин Failsafe, предназначенный для запуска интеграционных тестов (применяется одновременно с обоими классами — CustomerIT и AddressIT).


Листинг 3.30. Файл pom.xml для компиляции и тестирования ограничений

>

>

>·········xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance" 

>·········xsi: schemaLocation="http://maven.apache.org/POM/4.0.0 

>·········http://maven.apache.org/xsd/maven-4.0.0.xsd">

>··4.0.0

>··

>····chapter03

>····org.agoncal.book.javaee7

>····1.0

>··

>··org.agoncal.book.javaee7.chapter03

>··chapter03-putting-together

>··1.0

>··

>····

>······org.hibernate

>······hibernate-validator

>······5.0.0.Final

>····

>····

>······org.jboss.weld.se

>······weld-se

>······2.0.0.Final

>····

>····

>······junit

>······junit

>······4.11

>······test

>····

>··

>··

>····

>······

>········maven-compiler-plugin

>········2.5.1

>········

>··········1.7

>··········1.7

>········

>······

>······

>········maven-failsafe-plugin

>········2.12.4

>········

>··········

>············integration-test

>············

>··············integration-test

>··············verify

>············

>··········

>········

>······

>····

>··

>

Чтобы скомпилировать классы, откройте командную строку в корневом каталоге, содержащем файл pom.xml, и введите следующую команду Maven:

>$ mvn compile

Чтобы выполнить интеграционные тесты с плагином Maven Failsafe, введите в командную строку:


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

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