1

Я использую Arquillian для тестирования EJB, который имеет явный локальный и удаленный интерфейс. Но в тесте Аркиллиан не «вводит» ничего в поле, которое имеет тип локального интерфейса или удаленный интерфейс.Arquillian не может ввести локальный или удаленный EJB на встроенный контейнер Glassfish

Я использую Glassfish, встроенный в качестве сервера для тестирования, и я использую junit4.

я использовал:

  1. @EJB,
  2. @Inject,
  3. @EJB(lookup="java:global/costa-services-depa/GreeterImpl!es.costa.GreeterLocal"),
  4. @EJB(lookup="java:global/costa-services-depa/GreeterImpl!es.costa.GreeterRemote")

С (2), даже для GreeterImpl или GreeterLocal или GreeterRemote это дает мне ошибка Could not inject members.

С (1,3,4) Я получаю java.lang.NullPointerException, что означает, что EJB не вводится.

Это часть моего кода:

@RunWith(Arquillian.class) 
public class greeterTest { 
@Deployment 
public static Archive<?> createDeployment() { 
    JavaArchive jar = ShrinkWrap.create(JavaArchive.class,"costa-services-depa") 
     .addClasses(
       GreeterRemote.class, 
       GreeterLocal.class, 
       Greeter.class) 
     .addAsManifestResource("test-persistence.xml", "persistence.xml") 
     .addAsManifestResource("jbossas-ds.xml") 
     .addAsManifestResource("META-INF/beans.xml", 
       ArchivePaths.create("beans.xml")); 
    return jar; 
} 

@Inject 
GreeterImpl greeter; 


@Test 
public void testTestServiceLocal(){ 
    System.out.println(greeter.getMessage()); 
} 
} 

Вот glassfish-resources.xml:

... 
<resources> 
<jdbc-resource pool-name="ArquillianEmbeddedH2Pool" 
    jndi-name="jdbc/arquillian"/> 
<jdbc-connection-pool name="ArquillianEmbeddedH2Pool" 
    res-type="javax.sql.DataSource" 
    datasource-classname="org.h2.jdbcx.JdbcDataSource"> 
    <property name="user" value="sa"/> 
    <property name="password" value=""/> 
    <property name="url" value="jdbc:h2:file:target/databases/h2/db"/> 
</jdbc-connection-pool> 
</resources> 

Вот test-persistence.xml:

... 
<persistence-unit name="test"> 
    <jta-data-source>jdbc/arquillian</jta-data-source> 
    <properties> 
     <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
     <property name="eclipselink.logging.level.sql" value="FINE"/> 
     <property name="eclipselink.logging.parameters" value="true"/> 
    </properties> 
</persistence-unit> 

Это arquillian.xml:

... 
<container qualifier="glassfish-embedded" default="true"> 
    <configuration> 
     <property name="resourcesXml"> 
      ejbModule/src/test/resources-glassfish-embedded/glassfish-resources.xml 
     </property> 
    </configuration> 
</container> 
... 

Это jbossas-ds.xml:

<datasources xmlns="http://www.jboss.org/ironjacamar/schema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation=" 
    http://www.jboss.org/ironjacamar/schema 
    http://docs.jboss.org/ironjacamar/schema/datasources_1_0.xsd"> 
<datasource enabled="true" 
    jndi-name="jdbc/arquillian" 
    pool-name="ArquillianEmbeddedH2Pool"> 
    <connection-url>jdbc:h2:mem:arquillian;DB_CLOSE_DELAY=-1</connection-url> 
    <driver>h2</driver> 
</datasource> 
</datasources> 

О зависимостей для Glassfish встроенных и Arquillian и JUnit:

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.jboss.arquillian</groupId> 
      <artifactId>arquillian-bom</artifactId> 
      <version>1.0.3.Final</version> 
      <scope>import</scope> 
      <type>pom</type> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

    <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> 

<profiles> 
    <profile> 
     <id>arquillian-glassfish-embedded</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <dependencies> 
      <dependency> 
       <groupId>org.jboss.arquillian.container</groupId> 
       <artifactId>arquillian-glassfish-embedded-3.1</artifactId> 
       <version>1.0.0.CR3</version> 
       <scope>test</scope> 
      </dependency> 
      <dependency> 
       <groupId>org.glassfish.main.extras</groupId> 
       <artifactId>glassfish-embedded-all</artifactId> 
       <version>3.1.2.2</version> 
       <scope>provided</scope> 
      </dependency> 
      <dependency> 
       <groupId>com.h2database</groupId> 
       <artifactId>h2</artifactId> 
       <version>1.3.166</version> 
       <scope>test</scope> 
      </dependency> 
     </dependencies> 

     <build> 
      <testResources> 
       <testResource> 
        <directory>ejbModule/src/test/resources</directory> 
       </testResource> 
       <testResource> 
        <directory>ejbModule/src/test/resources-glassfish-embedded</directory> 
       </testResource> 
      </testResources> 
      <plugins> 
       <plugin> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <version>2.12</version> 
        <configuration> 
         <systemPropertyVariables> 
          <arquillian.launch>glassfish-embedded</arquillian.launch> 
          <java.util.logging.config.file> 
           ${project.build.testOutputDirectory}/logging.properties 
          </java.util.logging.config.file> 
          <derby.stream.error.file> 
           ${project.build.directory}/derby.log 
          </derby.stream.error.file> 
         </systemPropertyVariables> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

В консоли я заметил:

Infos: Network listener https-listener on port 0 disabled per domain.xml 
Infos: Grizzly Framework 1.9.50 started in: 32ms - bound to [0.0.0.0:8181] 
Infos: GlassFish Server Open Source Edition 3.1.2.2 (java_re) startup time : 
Embedded (525ms), startup services(384ms), total(909ms) 
Infos: command add-resources result: 
PlainTextActionReporterSUCCESSDescription: add-resources AdminCommandnull 
JDBC connection pool ArquillianEmbeddedH2Pool created successfully. 
JDBC resource jdbc/arquillian created successfully. 
Infos: SEC1002: Security Manager is OFF. 
Infos: SEC1010: Entering Security Startup Service 
Infos: SEC1143: Loading policy provider 
com.sun.enterprise.security.jacc.provider.SimplePolicyProvider. 
Infos: SEC1115: Realm [admin-realm] of classtype 
[com.sun.enterprise.security.auth.realm.file.FileRealm] successfully created. 
[com.sun.enterprise.security.auth.realm.file.FileRealm] successfully created. 
Infos: SEC1115: Realm [file] of classtype 
[com.sun.enterprise.security.auth.realm.file.FileRealm] successfully created. 
Infos: SEC1115: Realm [certificate] of classtype 
[com.sun.enterprise.security.auth.realm.certificate.CertificateRealm] successfully created. 
Infos: SEC1011: Security Service(s) Started Successfully 
Infos: WEB0169: Created HTTP listener [http-listener] on host/port [0.0.0.0:8181] 
Infos: WEB0171: Created virtual server [server] 
Infos: WEB0172: Virtual server [server] loaded default web module [] 
Infos: WELD-000900 SNAPSHOT 
Infos: WEB0671: Loading application [**test**] at [**/test**] 
Infos: test was successfully deployed in 1 822 milliseconds. 
PlainTextActionReporterSUCCESSNo monitoring data to report. 
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.308 sec 
Infos: Shutdown procedure finished 
Infos: [Thread[GlassFish Kernel Main Thread,5,main]] exiting 

NB: По умолчанию который развертывается как тест приложение или нет, как я сделал «costa-services-depa»?

Чтобы узнать, что на пути вызова EJB я ставил тест вместо costa-service-depa, но всегда он дает мне ту же проблему (NullPointerException).

+0

Извините, у меня не много опыта с Glassfish (встроенный точно), и проблема выглядит странно. По описанию вы все в порядке. Но для эксперимента вы можете переключиться на другой тип сервера приложений и снова проверить? WildFly/JBoss будет предпочтительнее. –

+0

Извините, с jboss это работает хорошо, но компания хочет использовать встроенную стеклянную рыбку – TinyOS

+0

Попробуйте! Мой опыт показывает, что JBoss/WildFly может показать вам некоторые скрытые проблемы, еще раз взглянуть на проблему. –

ответ

1

У меня такая же проблема, пытаясь каким-то образом вставить контекстный компонент в тест Arquillian против GlassFish 4.1. Этой проблема кажется связана с GlassFish (основная и открытая) ошибка:

https://java.net/jira/browse/GLASSFISH-21167

Они говорят, что инъекции в GlassFish не будут работать развертывание войны с определенными условиями:

  1. использования приложения пустой <absoluteOrdering> тег в web.xml

  2. Классы приложения упакованы в виде архивов jar в каталоге [war]\WEB-INF\lib\ directo гу, а не включили их распакованы в [war]\WEB-INF\classes\ каталоге

Что происходит со мной, что мой @Singleton компонент создается и вводится, но для каждый@EJB ссылка в приложении, а не только что создали один раз. Я проверил свое развертывание Arquillian на GF (glassfish-4.1\glassfish\domains\domain1\applications\test), и я вижу test.jar, развернутый в [war]\WEB-INF\lib\. У меня нет web.xml в моем приложении, и я не вижу его в моем развертывании GlassFish. Я думаю, что web.xml предоставляется как-то автоматически.

Развертывание того же приложения с Arquillian на Wildfly отлично работает, и мой bean-код @Singleton вводится правильно, как ожидалось.

Смежные вопросы