Question

J'ai des problèmes pour réaliser des tests Wildfly sous NetBeans et Maven.Je suis capable de lancer une application depuis l'IDE, je peux même la déboguer avec le débogueur Netbeans, cependant dès que je lance les tests unitaires, j'obtiens l'erreur suivante :

No EJBContainer provider available: no provider names had been found.
javax.ejb.EJBException
    at javax.ejb.embeddable.EJBContainer.reportError(EJBContainer.java:216)
    at javax.ejb.embeddable.EJBContainer.createEJBContainer(EJBContainer.java:146)
    at javax.ejb.embeddable.EJBContainer.createEJBContainer(EJBContainer.java:102)
    at cz.interactsys.ejb.StatefulSessionBeanTest.setUp(StatefulSessionBeanTest.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)

Le code est standard comme le suivant :

    int numberA = 1;
    int numberB = 2;
    EJBContainer container = javax.ejb.embeddable.EJBContainer.createEJBContainer();
    MyBean instance = (MyBean) container.getContext().lookup("java:global/classes/MyBean");
    int expResult = 3;
    int result = instance.plusOne(1);
    assertEquals(expResult, result);
    container.close();

Merci d'avance.

Était-ce utile?

La solution

Le problème est qu'il n'y a pas du tout d'EJBContainer dans Wildfly.Je ne sais pas comment cela est possible étant donné qu'EJBContainer devrait être là selon les spécifications de la plate-forme.néanmoins nous devons utiliser quelque chose de différent et c'est Arquillian.Ce texte s'inspire de nombreux autres articles, notamment celui-ci, cependant la solution suggérée ici utilise la même installation Wildfly pour les tests que pour le déploiement régulier, ce qui me semble préférable.

Il est nécessaire de suivre attentivement les conseils suivants.Alors ça marchera.

Étape zéro - préparation : Préparons quelque chose que nous pouvons utiliser pour les tests.

Ayons un projet Maven JavaEE classique, c'est-à-dire :

demoproj
demoproj-ear
demoproj-ejb
demoproj-war

J'utilise NetBeans, mais les étapes suivantes ne devraient pas être très différentes, même pour d'autres IDE.Créons bien sûr des éléments comme des beans entité, des unités de persistance et des beans session afin d'avoir quelque chose à tester.J'ai créé une unité de persistance de démonstration à l'aide de NetBeans, une entité utilisant la base de données et un bean session de l'entité.

La première étape: Nous ajoutons le code suivant dans pom.xml de demoproj (c'est-à-direle projet maître) :

<properties>
    <junit-version>4.11</junit-version>
    <arquillian-version>1.1.4.Final</arquillian-version>
    <arquillian-wildfly-version>8.1.0.Final</arquillian-wildfly-version>
    <arquillian-transaction-version>1.0.1.Final</arquillian-transaction-version>  
    <javaee-server-home>/Java/wildfly-8.1.0.Final</javaee-server-home>
</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>
<build>
    <pluginManagement>
        <plugins>
            <!-- compiler plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${compiler-plugin-version}</version>
                <configuration>
                    <source>${java-version}</source>
                    <target>${java-version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <!-- maven ear plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ear-plugin</artifactId>
                <version>${ear-plugin-version}</version>
                <configuration>
                    <generateModuleId>true</generateModuleId>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <!-- ejb plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ejb-plugin</artifactId>
                <version>${ejb-plugin-version}</version>
                <configuration>
                    <ejbVersion>${ejb-spec-version}</ejbVersion>
                </configuration>
            </plugin>
            <!-- war plugin -skinny wars mode! -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>${war-plugin-version}</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                        </manifest>
                    </archive>
                    <webResources>
                        <resource>
                            <filtering>true</filtering>
                            <directory>src/main/webapp</directory>
                            <includes>
                                <include>**/web.xml</include>
                            </includes>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
            <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.17</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.8</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>    

Deuxième étape : Nous ajoutons ce qui suit dans la section dépendances du pom.xml de demoproj-ejb :

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
        <type>jar</type>
    </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>        

Ajoutez ceci dans la section plugins de demoproj-ejb :

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <argLine>-Dfile.encoding=UTF-8</argLine>
                <forkCount>1C</forkCount>
                <systemPropertyVariables>
                    <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
                    <jboss.home>${javaee-server-home}</jboss.home>
                </systemPropertyVariables>
                <redirectTestOutputToFile>false</redirectTestOutputToFile>
            </configuration>
        </plugin> 

Troisième étape: Créons l'unité de test.Si nous utilisons une fonction IDE normale, nous obtenons quelque chose comme ceci :

package com.demopack.demoproj;

import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;

public class DemoBeanLocalTest {

    public DemoBeanLocalTest() {
    }

    @Before
    public void setUp() {
    }

    @Test
    public void testBusinessMethod() {
    }

}

Il faut maintenant ajouter @RunWith(Arquillian.class) juste avant l'en-tête de la classe, vous devez supprimer le constructeur par défaut et ajouter le code suivant dans la classe testing :

@EJB
DemoBeanLocal demoBean;

@Deployment
public static JavaArchive createDeployment() {

    JavaArchive jar = ShrinkWrap.create(JavaArchive.class);
    jar.addAsResource("test-persistence.xml", "META-INF/persistence.xml");
    jar.addPackage("com.demopack.demoproj");
    jar.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");

    return jar;
}

Ensuite, vous pouvez ajouter quelques méthodes de test comme d'habitude.L'ensemble de la classe de test pourrait ressembler à ceci :

package com.demopack.demoproj;

import javax.ejb.EJB;
import junit.framework.Assert;
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.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(Arquillian.class)
public class DemoBeanLocalTest {

    @EJB
    DemoBeanLocal demoBean;

    @Deployment
    public static JavaArchive createDeployment() {

        JavaArchive jar = ShrinkWrap.create(JavaArchive.class);
        jar.addAsResource("test-persistence.xml", "META-INF/persistence.xml");
        jar.addPackage("com.demopack.demoproj");
        jar.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");

        return jar;
    }

    @Before
    public void setUp() {
    }

    @Test
    public void testBusinessMethod() {

        Assert.assertEquals("test test", demoBean.businessMethod("test"));
    }

}

Quatrième étape : C'est presque terminé, mais il reste encore une chose très importante :sous demoproj-ejb créer src/test/resources dossier et copiez-y persistence.xml depuis src/main/resources/META-INF et renommez-le en test-persistence.xml.

Assurez-vous que la base de données est en cours d'exécution, qu'un pilote valide est installé, que la source de données correcte est utilisée, etc.Dans mon cas, la plupart des problèmes étaient causés par des problèmes de ce type.

C'est ça! Maintenant, vous devriez faire le ménage et bâtir sur demoproj et si tout va bien, vous pouvez utiliser la fonction de test normale de NetBeans comme vous en avez l'habitude.Apprécier!

MISE À JOUR Si vous préférez utiliser une instance distante (soit sur un serveur distant, soit une instance en cours d'exécution sur la même machine), ce que je recommande en raison d'un certain gain de performances, vous devez modifier les parties suivantes du code :

Dans pom.xml dans le projet maître :

Échange:

`<artifactId>wildfly-arquillian-container-embedded</artifactId>` for
`<artifactId>wildfly-arquillian-container-remote</artifactId>`.

Retirer:

<dependency>
    <groupId>org.wildfly</groupId>
    <artifactId>wildfly-embedded</artifactId>
    <version>${arquillian-wildfly-version}</version>
</dependency>

Faites ensuite la même chose dans pom.xml de demoproj-ejb.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top