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

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


Листинг 4.9. Тестовый класс, который создает и извлекает Book из базы данных

>public class BookIT {

>··private static EntityManagerFactory emf = 

>·················Persistence.createEntityManagerFactory("chapter04TestPU");

>··private EntityManager em;

>··private EntityTransaction tx;

>··@Before

>··public void initEntityManager() throws Exception {

>····em = emf.createEntityManager();

>····tx = em.getTransaction();

>··}

>··@After

>··public void closeEntityManager() throws Exception {

>····if (em!= null) em.close();

>··}

>··@Test

>··public void shouldFindjavaee7Book() throws Exception {

>····Book book = em.find(Book.class, 1001L);

>····assertEquals("Изучаем Java EE 7", book.getTitle());

>··}

>··@Test

>··public void shouldCreateH2G2Book() throws Exception {

>····// Создает экземпляр Book

>····Book book = new Book("H2G2", "Автостопом по Галактике", 

>····12.5F, "1-84023-742-2", 354, false);

>····// Обеспечивает постоянство Book в базе данных

>····tx.begin();

>····em.persist(book);

>····tx.commit();

>····assertNotNull("ID не может быть пустым", book.getId());

>····// Извлекает информацию обо всех соответствующих книгах из базы данных

>····book = em.createNamedQuery("findBookH2G2", Book.class). getSingleResult();

>····assertEquals("Автостопом по Галактике", book.getDescription());

>··}

>··@Test(expected = ConstraintViolationException.class)

>··public void shouldRaiseConstraintViolationCauseNullTitle() {

>····Book book = new Book(null, "Пустое название, ошибка", 12.5F, 

>····"1-84023-742-2", 354, false);

>····em.persist(book);

>··}

>}

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

Две единицы сохраняемости отличаются в том смысле, что chapter04PU использует работающую базу данных Derby, а chapter04TestPU — ту, что располагается в оперативной памяти. Обратите внимание, что они обе задействуют сценарий inset.sql для ввода информации в базу данных во время выполнения.


Листинг 4.10. Файл persistence.xml

>

>

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

>··

>····org.eclipse.persistence.jpa.PersistenceProvider

>····org.agoncal.book.javaee7.chapter04.Book

>····

>······

>value="drop-and-create"/>

>······

>················value="database-and-scripts"/>

>······

>················value="org.apache.derby.jdbc.ClientDriver"/>

>······


Рекомендуем почитать
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 так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.