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

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

. В листинге 15.29 показана выдержка из этого WADL-описания.


Листинг 15.29. Выдержка из описания на языке WADL, сгенерированного GlassFish для веб-службы BookRestService в стиле REST

>

>··

>····

>······

>········

>··········

>··········

>········

>······

>····

>······

>········

>··········

>············

>············

>··········

>········

>········

>······

>····

>··…

>··

>

Код WADL в листинге 15.29 описывает корневой путь (http://localhost:8080/chapter15-service-1.0/rs/) и все подпути, доступные в REST-службе (/book и {id}). Кроме того, здесь описаны HTTP-методы, которые вы можете вызывать (POST, GET, DELETE…).

Написание интеграционного теста BookRestServiceIT

Теперь, когда код упакован и развернут в GlassFish, мы можем написать интеграционный тест, в ходе которого будем выполнять HTTP-запросы к веб-службе REST. При этом воспользуемся новым API JAX-RS 2.0 Client. Интеграционные тесты отличаются от модульных, так как в них ваш код проверяется неизолированно. Этим тестам требуются все контейнерные службы. Как правило, если GlassFish и Derby в данный момент не работают, код из листинга 15.30 тоже не сработает.

Первые два метода тестируют отказы. Тест shouldNotCreateANullBook гарантирует, что вы не сможете создать книгу с нулевым объектом Book. Итак, он посылает нулевую сущность и ожидает получить код состояния 400 — Плохой запрос. В тестовом случае shouldNotFindTheBookID передается неизвестный ID книги, после чего предполагается получить код состояния 404 — Не найдено.

Тестовый случай shouldCreateAndDeleteABook немного сложнее первого, так как в нем вызывается несколько операций. Во-первых, этот тест отправляет XML-представление объекта Book и позволяет убедиться, что возвращается код состояния 201 — Создан. Переменная bookURI соответствует URI только что созданной записи о книге. В тестовом случае этот URI применяется для запроса новой книги. Затем код считывает тело сообщения, приводит его к классу Book (book = response.readEntity(Book.class)) и выполняет утверждения, гарантирующие корректность значений. Затем вызывается метод DELETE, удаляющий запись о книге из базы данных и удостоверяющий, что в ответ приходит код состояния 204 — Нет содержимого. Последний запрос GET, выполняемый с ресурсом, гарантирует удаление этого ресурса, проверяя наличие кода состояния 404 — Не найдено.


Листинг 15.30. Класс ApplicationConfig, объявляющий URL-шаблон /rs

>public class BookRestServiceIT {


>··private static URI uri = UriBuilder.

>··fromUri("http://localhost/chapter15-service-1.0/rs/book"). port(8080). build ();

>··private static Client client = ClientBuilder.newClient();


>··@Test

>··public void shouldNotCreateANullBook() throws JAXBException {


>····// Отправка нулевой книги методом POST

>····Response response = client.target(uri). request(). post(Entity.entity(null, 

>····MediaType.APPLICATION_XML));

>····assertEquals(Response.Status.BAD_REQUEST, response.getStatusInfo());

>··}


>··@Test

>··public void shouldNotFindTheBookID() throws JAXBException {


>····// Получение книги с неизвестным ID методом GET

>····Response response = client.target(uri). path("unknownID"). request(). get ();

>····assertEquals(Response.Status.NOT_FOUND, response.getStatusInfo());

>··}


>··@Test

>··public void shouldCreateAndDeleteABook() throws JAXBException {


>····Book book = new Book("H2G2", 12.5F, "Science book", "1-84023-742-2", 354, false);

>····// Посылаем книгу методом POST

>····Response response = client.target(uri). request(). post(Entity.entity(book, 

>····MediaType.APPLICATION_XML));

>····assertEquals(Response.Status.CREATED, response.getStatusInfo());

>····URI bookURI = response.getLocation();


>····// Имея местоположнение, получаем книгу методом GET

>····response = client.target(bookURI). request(). get();

>····book = response.readEntity(Book.class);

>····assertEquals(Response.Status.OK, response.getStatusInfo());

>····assertEquals("H2G2", book.getTitle());


>····// Получаем id книги и удаляем ее методом DELETE

>····String bookId = bookURI.toString(). split("/")[6];

>····response = client.target(uri). path(bookId). request(). delete();

>····assertEquals(Response.Status.NO_CONTENT, response.getStatusInfo());


>····// Методом GET получаем книгу Book и проверяем, была ли она удалена

>····response = client.target(bookURI). request(). get();

>····assertEquals(Response.Status.NOT_FOUND, response.getStatusInfo());

>··}

>}

Убедитесь, что GlassFish и Derby работают нормально и приложение развернуто, а затем выполните этот тест с применением плагина Maven Failsafe. Для этого введите в командной строке следующую команду Maven:


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