В данном уроке я продемонстрирую один из способов тестирования EJB3 с использование TestNG и Glassfish Embedded.
Шаг 0. Построение задачи
Начнем из самого простого, это с построения задачи.
Значит нам нужно протестировать какой-то EJB класс, тот кто никогда не пробовал это делать скажет: – А что же тут такого сложного или непонятного?
Оно то может и так, но только после того как ты уже делал это, но если вам впервые пришлось написать тесты для Stateless bean, то вы столкнётесь с такой проблемой как инъекция EJB бинов.
Значит наше цель заставить тесты создавать эеземпляры EJB по средством DI (dependency injection).
Если вы слабо знакомы с EJB, то совету юпрочитать это Введение в основы EJB3.
Шаг 1. Создание простого проекта с EJB
Для начало созданим простой Maven Project. В Intellij IDEA так: File – New Project – Maven module и я назвал проект ExampleTestingEJB.
После этого давайте добавим необходимые зависимости в pom.xml:
<dependency> <groupId>org.glassfish.main.extras</groupId> <artifactId>glassfish-embedded-all</artifactId> <version>3.1.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.4</version> <scope>test</scope> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency>
Теперь разберемся для чего же эти зависимости:
javaee-api – позволит нам создавать EJB beans;
testng – альтернатива JUnit, которая позволит нам писать unit тесты;
glassfish-embedded-all – обеспечит возможность поднять в памяти GlassFish контейнер с помощью которого мы и иджектить бины.
Вот структура проекта который мы делаем:
Шаг 2. Создание Stateless Bean
Для начало создадим пакет как показанно в структуре проекта выше и в нем создадим класс HelloWorld.java со следующим содержимым:
package com.exam.bean; import javax.ejb.Stateless; @Stateless public class HelloWorld { public String hello(String message) { return "Hello " + message; } }
Как видите мы создали простой класс с одним методо, и проанотировали его как Stateless bean.
Шаг 3. Пишем Unit тесты
Для начало создадим класс HelloWorldTest как показанно в структуре проекта:
package com.exam.bean; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertTrue; import javax.ejb.embeddable.EJBContainer; import javax.naming.Context; import javax.naming.NamingException; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class HelloWorldTest { private static EJBContainer ejbContainer; private static Context ctx; private static HelloWorld helloWorld; @BeforeClass public static void setUpClass() throws Exception { // Создайте экземпляр встроеного контейнера EJB ejbContainer = EJBContainer.createEJBContainer(); // Получаем контекст именования для поиска сессионного компонента ctx = ejbContainer.getContext(); // Получить ссылку на сессионный бин с помощью глобального имя JNDI helloWorld = (HelloWorld) ctx.lookup("java:global/classes/HelloWorld"); } @AfterClass public static void tearDownClass() throws Exception { // звкрываем ejb контейнер ejbContainer.close(); } @Test public void testIsExistHelloWorld() throws NamingException { assertNotNull(helloWorld); String expected = "World"; String hello = helloWorld.hello(expected); assertNotNull(hello); assertTrue(hello.endsWith(expected)); } }
В BeforeClass мы в начале нашего теста будет запускать встроеный Glassfish EJB контейнер и потом с помощью его контекста будем получать экземпляры наших EJB классов.
И таким вот образом мы получаем наш экземляр с Glassfish EJB контейнера.
helloWorld = (HelloWorld) ctx.lookup("java:global/classes/HelloWorld");
Шаг 4. Запускаем наш тестывый класс
Для того чтобы запустить наш тестовый класс вам нужно в мавен меню выбрать фазу test:
После этого вы Intellij IDEA console вы увидите в конце теста примерно такой результат:
Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 7.985s [INFO] Finished at: Fri Nov 15 13:06:48 EET 2013 [INFO] Final Memory: 7M/236M [INFO] ------------------------------------------------------------------------
Если возникнут какие-то вопросы, то не стесняйтесь и задавайте их в коментариях я с радостью отвечу.
ПОХОЖИЕ ПУБЛИКАЦИИ
- None Found
2 комментариев к статье "Как тестировать EJB 3 c помощью Glassfish Embedded?"