Статьи

Проект Java EE7 и Maven для новичков — часть 5 — Модульное тестирование с использованием Arquillian / Wildfly 8

Возобновление из предыдущих частей

Часть № 1 , Часть № 2 , Часть № 3 , Часть № 4 ,
Это первое «дополнительное» сообщение, основанное на демонстрационном проекте JavaE7 на maven, который я «строю» на этой серии сообщений в блоге. Мы уже определили солидную структуру и некоторые модули. Один из очень распространенных случаев в таком приложении — использование Arquillian (+ JUnit ), фреймворка, отправленного Богом, который позволяет нам проводить модульное тестирование наших EJB-сервисов с использованием «реального» сервера приложений, скорее всего, того же, что и мы развернуть в. На самом деле я следую базовому руководству по настройке, которое можно найти здесь , с той разницей, что я собираюсь установить Wildfly 8.1 в качестве встроенного контейнера для размещения моих модульных тестов.
Widlfy 8.1 — это полноценный контейнер JavvaEE7, так что я могу безопасно протестировать все свои функции.

Arquillian мышление и Maven

Одна из основных вещей, которую вам необходимо понять, чтобы принять Arquillian в вашем Maven-ized проекте, — это следующие термины (идеи), которые фактически реализуются как зависимости.

  • Конечно, вам нужна библиотека / библиотека Arquillian, представьте, что это новый автомобиль, но отсутствует его двигатель. Передняя часть пуста.
  • Вам нужен Arquillian Container Adapter , представьте, что вам нужно установить какие-то заполнители в передней части вашего автомобиля, что-то вроде рамы, которая будет использоваться для «установки» двигателя.
  • Вам нужен настоящий контейнер (сервер приложений), это двигатель, который мы собираемся вписать в нашу машину.
  • Вам нужен JUnit , это « тестовый трек », на котором ваша машина будет ездить и тестироваться.
  • Вам нужен ваш код (ваш EJB (ы)), это пассажиры, которых собираются посадить в машину и протестировать поездку на треке Junit.

Определение зависимостей от родительского пом

Как мы уже говорили в предыдущих 4 постах, родительский pom — это место для определения зависимостей и их версий библиотек, которые будут использоваться в нашем приложении. Имейте в виду приведенный выше список терминов, давайте начнем и обновим раздел dependencyManagement нашего родительского pom.

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<junit-version>4.11</junit-version>
 <arquillian-version>1.1.4.Final</arquillian-version>
 <arquillian-wildfly-version>8.1.0.CR2</arquillian-wildfly-version>
 <arquillian-transaction-version>1.0.1.Final</arquillian-transaction-version>
</properties>
 <dependencyManagement>
      <dependencies>
          <dependency>
              <groupId>javax</groupId>
              <artifactId>javaee-api</artifactId>
              <version>${javaee-api-version}</version>
          </dependency>
          <!-- -JUNIT-->
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>${junit-version}</version>
          </dependency>
          <!-- rquillian itself-->
          <dependency>
              <groupId>org.jboss.arquillian</groupId>
              <artifactId>arquillian-bom</artifactId>
              <version>${arquillian-version}</version>
              <scope>import</scope>
              <type>pom</type>
          </dependency>
          <!-- this is in an extention to arquillian it is optional-->
          <dependency>
              <groupId>org.jboss.arquillian.extension</groupId>
              <artifactId>arquillian-transaction-bom</artifactId>
              <version>${arquillian-transaction-version}</version>
              <type>pom</type>
              <scope>import</scope>
           </dependency>
           <!-- this is container adapter for wildfly-->
            <dependency>
               <groupId>org.wildfly</groupId>
               <artifactId>wildfly-arquillian-container-embedded</artifactId>
               <version>${arquillian-wildfly-version}</version>
            </dependency>
            <!-- this is the wildfly emb.container - BUT eventually it is not a fully blown emb.container-->
            <dependency>
               <groupId>org.wildfly</groupId>
               <artifactId>wildfly-embedded</artifactId>
               <version>${arquillian-wildfly-version}</version>
           </dependency>
       </dependencies>
 </dependencyManagement>

Несколько советов по приведенному фрагменту:

  • Некоторые из зависимостей имеют тип pom и область видимости. На самом деле это особый случай определения группы зависимостей вместе. Зависимость типа pom означает, что это группа отдельных библиотек, сгруппированных по этому определению. Вам нужно только определить этот uber pom, и вы унаследуете отдельные зависимости внутри него. В терминологии Maven эта группа зависимостей называется « спецификацией » или также называется спецификацией . Arquillian состоит из нескольких конкретных библиотек и зависимостей, вместо определения каждой из них, одна за другой, мы получим тот же результат, если мы определим arquillian-bom.
  • Arquillian -action-bom ‘ является необязательной зависимостью, вы можете ее не определять, она добавляет дополнительные функции в механизм arquillian и в ваши тесты. Одной из самых известных дополнительных функций является аркиллиановая аннотация @Transactional. Подробности смотрите здесь или здесь .
  • Особый случай, для Wildfly и JBoss. Вы заметите зависимость « wildfly-внедрено », вы предположите, что это « встроенная » версия Uber-сервера сервера приложений Wildfly, такая же, как для Glassfish. В конце концов это не так, и это распространенная ошибка, которую люди допускают, пытаясь настроить Arquillian с Wildfly. Чтобы все это работало, вам нужно скачать «настоящий» сервер приложений. Посмотрите на следующий раздел, где будет рассмотрен этот особый случай.

Настройка нашего модуля ejb для Arquillian и тестов

В наших демонстрационных приложениях мы «закодировали» большинство наших EJB-сервисов в модуле, называемом sample-ejb. Поэтому нам нужно добавить дополнительную конфигурацию в его pom, чтобы « запустить » тесты junit + arquillian во время фазы тестирования этого модуля.

Большая часть конфигурации для этой помпы заключается в том, чтобы охватить этот « особый » случай, когда Widlfly не предлагается в качестве полностью унесенного встроенного контейнера. Таким образом, чтобы заставить весь механизм работать, нам нужно сказать Maven на этапе тестирования, чтобы скачать Wildfly.zip (как мы это сделали бы, например, с помощью браузера), разархивировать его куда-нибудь и указать Arquillian путь. Как только это будет сделано, RAquillian вступит во владение.

Загрузка сервера wildfly, перед раздачей

Приведенная ниже конфигурация написана в разделе примеров услуг, нашего модуля «Службы EJB»:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<plugin>
       <artifactId>maven-dependency-plugin</artifactId>
            <executions>
             <execution>
                <id>unpack</id>
                    <phase>process-test-classes</phase>
                     <goals>
                         <goal>unpack</goal>
                      </goals>
                <configuration>
                <artifactItems>
                    <artifactItem>
                       <groupId>org.wildfly</groupId>
                       <artifactId>wildfly-dist</artifactId>
                        <version>8.1.0.Final</version>
                        <type>zip</type>
                        <overWrite>false</overWrite>
                        <outputDirectory>target</outputDirectory>
                    </artifactItem>
                </artifactItems>
             </configuration>
          </execution>
      </executions>
 </plugin>

Несколько советов по приведенному фрагменту:

  • Мы используем maven-зависимость-плагин
  • Мы инструктируем плагин включаться во время фазы «процесс-тест-классы» жизненного цикла Maven и когда он включается для выполнения цели «распаковать». Поэтому, прежде чем Maven начнет запускать тесты, вышеуказанная часть конфигурации загрузит и распакует Wildfly 8.1 в путь к классам.

Запуск тестов с использованием плагина maven — surfire

Снова код ниже является частью sample-services.pom. Мы фактически настраиваем плагин Maven Surefire, который является плагином, который выполняет тесты Junit-Arquilian.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<plugin>
     <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-surefire-plugin</artifactId>
      <configuration>
        <!-- Fork every test because it will launch a separate AS instance -->
         <forkMode>always</forkMode>
         <systemPropertyVariables>
            <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
            <jboss.home>${project.basedir}/target/wildfly-8.1.0.Final</jboss.home>
           <module.path>${project.basedir}/target/wildfly-8.1.0.Final/modules</module.path>
          </systemPropertyVariables>
          <redirectTestOutputToFile>false</redirectTestOutputToFile>
     /configuration>
 </plugin>

Несколько советов по приведенному фрагменту:

  • Surefire предоставляет среду выполнения для модульных тестов. В нашем случае у нас есть тесты Junit-Arquillian. Чтобы Arquillian правильно инициализировал себя и идентифицировал контейнер, нам нужно передать в качестве системных параметров путь к серверу приложений загрузки. Помните, что wildfly / jboss — это особый случай. Контейнер уже будет загружен в папку out / target.

Добавьте необходимые зависимости в модуль sample-services

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
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>test</scope>
</dependency>
 
<dependency>
    <groupId>org.jboss.arquillian.junit</groupId>
    <artifactId>arquillian-junit-container</artifactId>
    <scope>test</scope>
</dependency>
 
<dependency>
    <groupId>org.wildfly</groupId>
    <artifactId>wildfly-arquillian-container-embedded</artifactId>
    <scope>test</scope>
</dependency>
 
<dependency>
    <groupId>org.wildfly</groupId>
    <artifactId>wildfly-embedded</artifactId>
    <scope>test</scope>
</dependency>
 
<dependency>
    <groupId>org.jboss.arquillian.extension</groupId>
    <artifactId>arquillian-transaction-jta</artifactId>
    <scope>test</scope>
</dependency>

Создать образец теста

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
  package gr.javapapo;
  
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
  
import javax.ejb.EJB;
  
/**
 * Created by papo on 5/31/14.
 */
@RunWith(Arquillian.class)
public class DemoArquillianTest {
  
    @EJB
    UserServices dummyService;
  
    @Deployment
    public static JavaArchive createDeployment() {
        return ShrinkWrap.create(JavaArchive.class)
                .addClass(UserServices.class)
                .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
    }
  
    @Test
    public void testSaysHello() {
        Assert.assertEquals("hello",dummyService.sayHello());
    }
}

Мы сделали

Под уровнем родительской папки введите:

1
mvn clean package