Эта команда создает Chapter08Pool с использованием источника данных Derby и набора свойств для соединения с базой данных: название (chapter08DB), сервер (localhost) и порт (1527), который он слушает, пользователь (APP) и пароль (APP) для подключения. Если вы сейчас опросите этот источник данных, Derby создаст базу данных автоматически (потому что вы установили значения connectionAttributes=;create\=TRUE). Чтобы опросить источник данных, используйте следующую команду:
$ asadmin ping-connection-pool Chapter08Pool
После успешного выполнения этой команды вы должны увидеть каталог chapter08DB на жестком диске в том месте, где Derby хранит свои данные. Будут созданы база данных и пул соединений, и теперь вам нужно объявить источник данных jdbc/chapter08DS и связать его с только что созданным пулом следующим образом:
$ asadmin create-jdbc-resource — connectionpoolid
··Chapter08Pool jdbc/chapter08DS
Для того чтобы получить список всех источников данных, хранящихся с помощью GlassFish, введите такую команду:
$ asadmin list-jdbc-resources
Написание интеграционного теста BookEJBIT
В версии 1.x и 2.x EJB интеграционное тестирование нашего BookEJB было бы затруднительно: вам пришлось бы использовать особенности определенных серверов приложений или внести изменения в код. С новым встроенным контейнером EJB становится проверяемым классом так же просто, как и любой другой класс, так как он может работать в нормальной среде Java SE. Единственное, что необходимо сделать, — добавить конкретный файл с расширением JAR в каталог, где хранится ваш файл, как это делается в файле pom.xml (он показан ниже, в листинге 8.17) с помощью зависимости glassfish-embedded-all.
В главе 4 я объяснил, как можно провести интеграционное тестирование для сущности со встроенной базой данных, поэтому я не буду вдаваться в подробности по данному вопросу. Для того чтобы произвести интеграционное тестирование EJB, вам следует использовать встроенную в память базу данных Derby, различные блоки хранения и встроенный в память контейнер EJB. Все эти компоненты уже готовы и работают в том же процессе, требуется только создать тестовый класс JUnit (листинг 8.16). Этот тест инициализирует EJBContainer(EJBContainer.createEJBContainer()), получает контекст JNDI, ищет EJB и использует его для создания и удаления книг, а также их извлечения во встроенную в память базу данных и из нее. Благодаря конструкции try-with-resources встроенный контейнер закрывается автоматически в конце блока try.
public class BookEJBIT {
··@Test
··public void shouldCreateABook() throws Exception {
····Map
····properties.put(EJBContainer.MODULES, new File("target/classes"));
····try (EJBContainer ec = EJBContainer.createEJBContainer(properties)) {
······Contextctx = ec.getContext();
······// Проверяет зависимости JNDI (источники данных и EJB)
······assertNotNull(ctx.lookup("java: global/jdbc/chapter08DS"));
······assertNotNull(
ctx.lookup("java: global/classes/BookEJB!org.agoncal.book.javaee7.chapter08.BookEJBRemote"));
······assertNotNull(
ctx.lookup("java: global/classes/BookEJB!org.agoncal.book.javaee7.chapter08.BookEJB"));
······// Ищет EJB
······BookEJB bookEJB = (BookEJB)
ctx.lookup("java: global/classes/BookEJB!org.agoncal.book.javaee7.chapter08.BookEJB");
······// Ищет все книги и убеждается, что их две (они добавлены
······// в базу с помощью DBPopulator)
······assertEquals(2, bookEJB.findBooks(). size());
······// Создает книгу
······Book book = new Book("H2G2", 12.5F, "Научная фантастика", "1-24561-799-0", 354, false);
······// Сохраняет книгу в базе данных