Выбрать главу
Листинг 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<ConstraintViolation<Address>> 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 для компиляции и тестирования ограничений

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" 

·········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">

··<modelVersion>4.0.0</modelVersion>

··<parent>

····<artifactId>chapter03</artifactId>

····<groupId>org.agoncal.book.javaee7</groupId>

····<version>1.0</version>

··</parent>

··<groupId>org.agoncal.book.javaee7.chapter03</groupId>

··<artifactId>chapter03-putting-together</artifactId>

··<version>1.0</version>

··<dependencies>

····<dependency>

······<groupId>org.hibernate</groupId>

······<artifactId>hibernate-validator</artifactId>

······<version>5.0.0.Final</version>

····</dependency>

····<dependency>

······<groupId>org.jboss.weld.se</groupId>

······<artifactId>weld-se</artifactId>

······<version>2.0.0.Final</version>

····</dependency>

····<dependency>

······<groupId>junit</groupId>

······<artifactId>junit</artifactId>

······<version>4.11</version>

······<scope>test</scope>

····</dependency>

··</dependencies>

··<build>

····<plugins>

······<plugin>

········<artifactId>maven-compiler-plugin</artifactId>

········<version>2.5.1</version>

········<configuration>

··········<source>1.7</source>

··········<target>1.7</target>

········</configuration>

······</plugin>

······<plugin>

········<artifactId>maven-failsafe-plugin</artifactId>

········<version>2.12.4</version>

········<executions>

··········<execution>

············<id>integration-test</id>

············<goals>

··············<goal>integration-test</goal>

··············<goal>verify</goal>

············</goals>

··········</execution>

········</executions>

······</plugin>

····</plugins>

··</build>

</project>

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

$ mvn compile

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

$ mvn integration-test

Резюме

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

В этой главе было показано, что ограничение состоит из аннотации и отдельного класса, реализующего логику валидации. При дальнейшей работе можно агрегировать имеющиеся ограничения для создания новых или переиспользовать уже имеющиеся. Спецификация Bean Validation содержит несколько встроенных ограничений, хотя, к сожалению, некоторых ограничений в ней сильно не хватает (@Email, @URL, @CreditCard).

В первой версии спецификации Bean Validation можно было валидировать только методы и атрибуты. Так обеспечивалось более качественное предметно-ориентированное проектирование, при котором неглубокая доменная валидация помещалась в сам POJO, что позволяло избегать антипаттерна «анемичный объект». В версии Bean Validation 1.1 появилась валидация конструкторов, параметров методов и возвращаемых значений. В настоящее время можно выполнять валидацию предусловий и постусловий, что приближает нас к проектированию по соглашениям.