Статьи

Тестирование Java EE 6, часть I — встраиваемый API EJB 3.1

Один из самых распространенных запросов, которые мы слышим от разработчиков Enterprise JavaBeans, касается улучшенной поддержки модульного / интеграционного тестирования.
Спецификация EJB 3.1 представила встраиваемый API-интерфейс EJB 3.1 для выполнения компонентов EJB в среде Java SE.

В отличие от традиционного выполнения на сервере Java EE, встраиваемое использование позволяет клиентскому коду и соответствующим корпоративным компонентам работать в одной JVM и загрузчике классов. Это обеспечивает лучшую поддержку для тестирования, автономной обработки (например, пакетной обработки) и использования модели программирования EJB в настольных приложениях.
[…] Встраиваемый контейнер EJB обеспечивает управляемую среду с поддержкой тех же базовых сервисов, которые существуют в среде выполнения Java EE: внедрение, доступ к компонентной среде, транзакции, управляемые контейнером, и т. Д. В общем, компоненты корпоративного компонента не знают о вид управляемой среды, в которой они работают. Это обеспечивает максимальное повторное использование корпоративных компонентов в широком диапазоне сценариев тестирования и развертывания без значительных переделок.

Давайте посмотрим на пример.

Начните с создания проекта Maven и добавьте встраиваемую зависимость GlassFish.
Я решил использовать среду тестирования TestNG , но JUnit должен работать так же хорошо.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<dependencies>
    <dependency>
        <groupId>org.glassfish.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>
    <!--
        The javaee-api is stripped of any code and is just used to
        compile your application. The scope provided in Maven means
        that it is used for compiling, but is also available when
        testing. For this reason, the javaee-api needs to be below
        the embedded Glassfish dependency. The javaee-api can actually
        be omitted when the embedded Glassfish dependency is included,
        but to keep your project Java-EE 6 rather than GlassFish,
        specification is important.
    -->
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

Вот простой сессионный компонент Stateless сохранения состояния:

1
2
3
4
5
6
@Stateless
public class HelloWorld {
    public String hello(String message) {
        return "Hello " + message;
    }
}

Он предоставляет бизнес-методы через представление без интерфейса .
Не существует специального API, который он должен использовать для возможности встраиваемого выполнения.

Вот некоторый тестовый код для выполнения bean-компонента в встраиваемом контейнере:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class HelloWorldTest {
    private static EJBContainer ejbContainer;
 
    private static Context ctx;
 
    @BeforeClass
    public static void setUpClass() throws Exception {
        // Instantiate an embeddable EJB container and search the
        // JVM class path for eligible EJB modules or directories
        ejbContainer = EJBContainer.createEJBContainer();
 
        // Get a naming context for session bean lookups
        ctx = ejbContainer.getContext();
    }
 
    @AfterClass
    public static void tearDownClass() throws Exception {
        // Shutdown the embeddable container
        ejbContainer.close();
    }
 
    @Test
    public void hello() throws NamingException {
        // Retrieve a reference to the session bean using a portable
        // global JNDI name
        HelloWorld helloWorld = (HelloWorld)
                ctx.lookup("java:global/classes/HelloWorld");
 
        // Do your tests
        assertNotNull(helloWorld);
        String expected = "World";
        String hello = helloWorld.hello(expected);
        assertNotNull(hello);
        assertTrue(hello.endsWith(expected));
    }
}

Исходный код доступен на GitHub в папке ejb31-embeddable .

Пошаговое руководство с примером JPA можно найти в разделе Использование встроенного контейнера EJB для тестирования корпоративных приложений из документов NetBeans.

Хотя этот новый API является шагом вперед, у меня все еще есть проблема с этим подходом: вы вводите контейнер в тест. Это требует специализированного контейнера, который отличается от вашей производственной среды.

В Java EE 6 Testing Part II я представлю Arquillian и ShrinkWrap .
Arquillian, мощная контейнерно-ориентированная инфраструктура тестирования, расположенная поверх TestNG и JUnit, дает вам возможность создавать производственную среду на выбранном вами контейнере и просто выполнять тесты в этой среде (используя источники данных, места назначения JMS и целый ряд другие конфигурации, которые вы ожидаете увидеть в производственной среде). Вместо того, чтобы переводить время выполнения в тест, Arquillian переносит ваш тест во время выполнения.

Похожие сообщения

Ссылка: тестирование Java EE 6, часть I — EJB 3.1 Встраиваемый API от нашего партнера JCG Самуэля Сантоса в блоге Samaxes .