Как тестировать EJB 3 c помощью Glassfish Embedded?

В данном уроке я продемонстрирую один из способов тестирования 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] ------------------------------------------------------------------------

Если возникнут какие-то вопросы, то не стесняйтесь и задавайте их в коментариях я с радостью отвечу.

Урок создан: 15 ноября 2013 | Просмотров: 6078 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 19 ноября 2013 в 14:50

    Sergey

    Смущает что jndi путь в имени должен быть по шаблону java:global/classes/*, если указать mappedName в самом бине и попытаться искать по нему, встроенный контейнер это игнорирует, в ситуации когда в разных пакетах бин с 1 именем lookup возвращает тот, что биндился первым. Как нибудь это победить можно? или только shift+F6 :D

    • 20 ноября 2013 в 14:30

      Александр Барчук

      Немножко позже постараюсь написать по этому поводу статейку. Объяснить наврятли получится

  • 08 марта 2016 в 16:07

    many mny

    А как тестировать, есть метод EJB отмечен @RolesAllowed ? Отдаёт javax.ejb.EJBAccessException
    Caused by: javax.ejb.AccessLocalException: Client not authorized for this invocation