Как и классу Main, BookIT в листинге 4.9 необходимо создать экземпляр EntityManager с использованием EntityManagerFactory. Для инициализации этих компонентов можно прибегнуть к фикстурам JUnit 4. Аннотации @Before и @After позволяют выполнять некоторый код до и после выполнения теста. Это идеальное место для создания и закрытия экземпляра EntityManager и получения транзакции.
Вариант тестирования shouldFindJavaEE7Book() опирается на информацию, которая уже присутствует в базе данных (подробнее о сценарии inset.sql мы поговорим позднее), и при поиске Book с идентификатором 1001 мы убеждается в том, что названием является "Изучаем Java EE 7". Метод shouldCreateH2G2Book() обеспечивает постоянство Book (с помощью метода EntityManager.persist()) и проверяет, был ли идентификатор автоматически сгенерирован EclipseLink (с использованием assertNotNull). Если да, то выполняется именованный запрос и осуществляется проверка, является ли "Автостопом по Галактике" описанием возвращенной сущности Book. Последний вариант тестирования создает Book с атрибутом Nulltitle, обеспечивает постоянство Book и удостоверяется в том, что было сгенерировано исключение ConstraintViolationException.
Написание единицы сохраняемости
Как вы можете видеть в классе Main (см. листинг 4.8), EntityManagerFactory требуется единица сохраняемости с именем chapter04PU. А для интеграционного теста BookIT (см. листинг 4.9) используется другая единица сохраняемости (chapter04TestPU). Эти две единицы сохраняемости должны быть определены в файле persistence.xml, находящемся в каталоге src/main/resources/META-INF (листинг 4.10). Этот файл, необходимый согласно спецификации JPA, важен, поскольку соединяет поставщика JPA (которым в нашем случае выступает EclipseLink) с базой данных (Derby). Он содержит всю информацию, необходимую для подключения к базе данных (URL-адрес, JDBC-драйвер, сведения о пользователе, пароль), и сообщает поставщику режим генерирования схемы базы данных (drop-and-create означает, что таблицы будут удалены, а затем снова созданы). Элемент
Две единицы сохраняемости отличаются в том смысле, что chapter04PU использует работающую базу данных Derby, а chapter04TestPU — ту, что располагается в оперативной памяти. Обратите внимание, что они обе задействуют сценарий inset.sql для ввода информации в базу данных во время выполнения.
·············xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"
·············xsi: schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
·············http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
·············version="2.1">
··
····
····
····
······
value="drop-and-create"/>
······
················value="database-and-scripts"/>
······
················value="org.apache.derby.jdbc.ClientDriver"/>
······
················value="jdbc: derby://localhost:1527/chapter04DB;create=true"/>
······
······
······
value="insert.sql"/>
····
··
··
····
····
····
······
value="drop-and-create"/>
······
value="database"/>
······
················value="org.apache.derby.jdbc.EmbeddedDriver"/>
······
················value="jdbc: derby: memory: chapter04DB;create=true"/>
······
value="insert.sql"/>
····
··
Написание SQL-сценария для загрузки данных