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).
<?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 появилась валидация конструкторов, параметров методов и возвращаемых значений. В настоящее время можно выполнять валидацию предусловий и постусловий, что приближает нас к проектированию по соглашениям.