2016-04-29 1 views
4

Lors du démarrage de maven avec les paramètres de test, j'obtiens l'exception mentionnée ci-dessus. Lors de la création du déploiement de test d'intégration, je reçois les éléments suivants:Impossible de traiter les interfaces métier pour la classe EJB

org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYEJB0466: Failed to process business interfaces for EJB class class ..contract.ContractMockService 

La classe au sujet ressemble à ceci:

package ..integration.bestand.contract; 

import java.time.LocalDate; 
import java.util.ArrayList; 

import javax.ejb.Local; 
import javax.ejb.Stateless; 

import org.apache.deltaspike.core.api.exclude.Exclude; 
import org.apache.deltaspike.core.api.projectstage.ProjectStage; 

... 

@Exclude(ifProjectStage = { 
    ProjectStage.Production.class, 
    ProjectStage.Staging.class, 
    ..Integration.class, 
    ..Qs.class, 
    ..PatchQs.class 
}) 
@Stateless 
@Local(IContractIntService.class) 
public class ContractMockService implements IContractIntService { 

    ... 

    return ContractBuilder.build(); 
    } 

} 

L'interface IContractIntService ressemble à:

package ..integration.bestand.contract; 

import javax.ejb.Local; 

... 

@Local 
public interface IContractIntService { 

    public enum State { 
    SUCCESS, 
    UNKNOWN_ERROR, 
    NOT_FOUND; 
    // TODO: Stati für Fehler hier definieren 
    } 

    //Interface comment 
    Result<State, ContractDTO> retrieveContract(String contractIdentifier); 
} 

Note: L'interface est dans un autre projet qui est inclus via maven.

Le test ressemble à ceci:

package ..api.contractregistration.service; 

import static org.hamcrest.CoreMatchers.any; 
import static org.hamcrest.MatcherAssert.assertThat; 

import java.util.logging.Logger; 

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.WebArchive; 
import org.junit.Rule; 
import org.junit.Test; 
import org.junit.experimental.categories.Category; 
import org.junit.rules.TestWatcher; 
import org.junit.runner.RunWith; 

import ..core.test.IntegrationTest; 

@RunWith(Arquillian.class) 
@Category(IntegrationTest.class) 
public class ContractRegistrationIntegrationTest { 

    protected final Logger log = Logger.getLogger(ContractRegistrationIntegrationTest.class.getCanonicalName()); 

    @Rule 
    public TestWatcher watcher = new TestWatcher() { 

    @Override 
    protected void starting(org.junit.runner.Description description) { 
     log.info(String.format("---> Starting test: %s", description)); 
    } 

    @Override 
    protected void failed(Throwable e, org.junit.runner.Description description) { 
     log.info(String.format("<--- Test failed: %s", description)); 
    } 

    @Override 
    protected void succeeded(org.junit.runner.Description description) { 
     log.info(String.format("<--- Test succeeded: %s", description)); 
    } 
    }; 

    @Deployment 
    public static WebArchive createDeployment() { 
    WebArchive result = ShrinkWrap.create(WebArchive.class) 
     .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") 
     .addAsResource("META-INF/persistence.xml", "META-INF/persistence.xml") 
     .addPackages(true, "..ejb.portal") 
     .addPackages(true, "..core") 
     .deletePackages(true, "..core.config.deltaspike") 
     .addPackages(true, "..integration") 
     .addPackages(true, "..api") 
     .addPackages(true, "org.apache.deltaspike.core") 
     .addPackages(true, "..ejb.util"); 
    System.out.println("########## TEST DEPLOYMENT########" + result.toString(true)); 

    return result; 
    } 

    @Test 
    public void test() { 
    String tempPw = "bla"; // result.getDto(); 
    assertThat(tempPw, any(String.class)); 
    } 

} 

La chose remarquable à propos de ce test est que je ne suis même pas quoi que ce soit à l'aide de la MockService dans un test.

La configuration de maven ressemble à ceci:

Objectifs: clean test -Parq-wildfly-managed Arguments VM: -Djboss.home="myLocalWildflyDirectory" JRE

JAVA_HOME est-il réglé à jdk8.

La dernière chose est mon pom, en particulier la partie du conteneur "ARQ-wildfly gérés":

... 

     <profile> 
      <!-- An optional Arquillian testing profile that executes tests in your WildFly instance, e.g. for build server --> 
      <!-- This profile will start a new WildFly instance, and execute the test, shutting it down when done --> 
      <!-- Run with: mvn clean test -Parq-wildfly-managed --> 
      <id>arq-wildfly-managed</id> 
      <dependencies> 
       <dependency> 
        <groupId>org.wildfly.arquillian</groupId> 
        <artifactId>wildfly-arquillian-container-managed</artifactId> 
        <scope>test</scope> 
       </dependency> 

       <dependency> 
        <groupId>de.ivi.torino</groupId> 
        <artifactId>torino-integration-bestand-mock-ejb</artifactId> 
        <version>1.0.0-SNAPSHOT</version> 
        <scope>test</scope> 
       </dependency> 

       <dependency> 
        <groupId>de.ivi.torino</groupId> 
        <artifactId>torino-integration-docservice-mock-ejb</artifactId> 
        <version>1.0.0-SNAPSHOT</version> 
        <scope>test</scope> 
       </dependency>  
       <dependency> 
        <groupId>de.ivi.torino</groupId> 
        <artifactId>torino-integration-bestand-api</artifactId> 
        <version>1.0.0-SNAPSHOT</version> 
       </dependency>   

      </dependencies> 
     </profile> 
... 

Une build Maven normale avec clean verify package install (juste pas de test inclus) construit avec succès.

Note: Pour cet article, j'ai renommé les packages afin d'exclure les spécialisations de l'entreprise.

Des erreurs similaires suggèrent de corriger le déploiement de ShrinkWrap, mais j'ai inclus pratiquement tous les paquets existants et j'ai même essayé d'inclure explicitement la classe d'interface. Mais encore, la même erreur reste.

Ce qui pourrait causer cela?

+0

Vous avez semblé mal comprendre le cycle de vie de Maven. Si vous appelez maven via 'mvn clean, vérifiez l'installation du paquet' que plusieurs choses tournent en double ou triple. Ce dont vous avez simplement besoin est: '' mvn clean install'' ou '' mvn clean verify'' ... Recommandez de lire https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html – khmarbaise

+0

@khmarbaise merci pour votre suggestion. Je peux clairement dire que je ne suis pas un expert chez maven. J'utilisais auparavant vos config run mentionnés et ils fonctionnaient, mais ma question ne visait pas les builds de travail. La construction 'test' est à l'origine de l'erreur mentionnée ci-dessus et me laisse dans l'ignorance ... – EngJon

+0

Peut-être que votre IContractService ne peut pas être chargé en raison de dépendances manquantes. Vous pouvez vouloir enregistrer votre journal sous la catégorie org.jboss.weld.Bootstrap au niveau INFO pour vous assurer que toutes les définitions de vos beans sont correctement enregistrées. – Franck

Répondre

0

Essayez ceci dans le test (ShrinkWrap):

.addAsResource(new StringAsset("org.apache.deltaspike.ProjectStage=IntegrationTest"), "META-INF/apache-deltaspike.properties") 

Et changer Ne comptez pas ceci:

@Exclude(exceptIfProjectStage = ProjectStage.IntegrationTest.class) 

Si vous avez besoin d'exclure des étapes supplémentaires, les ajouter à cette exclure déclaration très

+1

Cela a fait l'affaire! J'ai également inclus l'exclusion pour mon producteur, qui a aussi résolu d'autres problèmes. – EngJon

+0

Comme je ne veux pas que ma prime expire, cette réponse me semble appropriée, bien qu'elle puisse avoir plus de détails sur pourquoi cette exclusion n'a pas fonctionné, mais bon, ça a marché;) – EngJon

0

Un peu en retard, mais une meilleure solution au problème était la suivante:

A l'intérieur du déploiement de ShrinkWrap, une utilisation du résolveur Maven shrinkwrap est nécessaire. Ainsi, au lieu de

.addPackages(true, "org.apache.deltaspike.core") 

dans la création de result, utilisez le résolveur Maven.Cela devrait ressembler à ceci:

ShrinkWrap 
    .create(WebArchive.class, "test.war") 
    .addAsLibraries(
     resolver.artifact("org.apache.deltaspike.core") 
    .resolveAsFiles()); 

L'artefact est l'artefact mavenId. cela retournera un autre .war. Plusieurs .wars (créés à partir du résolveur ou de la façon dont vous voyez dans la question d'origine) peuvent être fusionnés. Cette fusion .war doit ensuite être renvoyée à partir de la méthode de déploiement.

raison derrière cela: externe comprend (dans ce cas deltaspike) manquent des ressources une fois que vous les importez via ShrinkWrap.create.*.addAsPackages.., donc ce ne doit être utilisé pour les packages de projets internes. Pour utiliser le résolveur Maven, vous pouvez inclure les éléments suivants dans le .pom fichier:

<dependency> 
<groupId>org.jboss.shrinkwrap.resolver</groupId> 
<artifactId>shrinkwrap-resolver-impl-maven</artifactId> 
<scope>test</scope> 
</dependency> 

crédits à dzone.com pour les extraits de code de résolveur Maven. Je travaille actuellement sur un autre projet, donc je ne peux pas montrer le code original, mais c'était très similaire à ça. Peut-être que cette solution aidera quelqu'un à l'avenir.