2012-08-07 4 views
0

J'essaie d'effectuer des tests arquilliens sur un modèle de données enraciné dans l'API JSF. Je reçois cette erreur:Comment écrire des tests Arquillian pour les classes JSF

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.046 sec <<< FAILURE! 
initializationError(mypackage.GenericLazyModelTest) Time elapsed: 0.003 sec <<< ERROR! 
java.lang.ClassFormatError: Absent Code attribute in method that is not native 
or abstract in class file javax/faces/model/DataModel 

simples essais Arquillian, ne comportant pas JSF, mais JPA et les API EJB fonctionnent très bien.
La recherche sur le Web suggère qu'une raison commune à cela est l'utilisation des API EE de bout du soleil telles que décrites here et here.

Je ne les utilise définitivement pas. Voici la partie de la dépendance de mon pom:

<dependencyManagement> 
     <dependencies> 
     <dependency> 
      <groupId>org.jboss.bom</groupId> 
      <artifactId>jboss-javaee-6.0-with-tools</artifactId> 
      <version>${javaee6.with.tools.version}</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 
     </dependencies> 
    </dependencyManagement> 

<dependency> 
    <groupId>javax.enterprise</groupId> 
    <artifactId>cdi-api</artifactId> 
    <scope>provided</scope> 
</dependency> 

<dependency> 
    <groupId>javax.faces</groupId> 
    <artifactId>jsf-api</artifactId> 
    <version>2.1</version> 
    <scope>provided</scope> 
</dependency> 

<dependency> 
    <groupId>org.jboss.spec.javax.annotation</groupId> 
    <artifactId>jboss-annotations-api_1.1_spec</artifactId> 
    <scope>provided</scope> 
</dependency> 

<dependency> 
    <groupId>org.jboss.spec.javax.ws.rs</groupId> 
    <artifactId>jboss-jaxrs-api_1.1_spec</artifactId> 
    <scope>provided</scope> 
</dependency> 

<dependency> 
    <groupId>org.hibernate.javax.persistence</groupId> 
    <artifactId>hibernate-jpa-2.0-api</artifactId> 
    <scope>provided</scope> 
</dependency> 

<dependency> 
    <groupId>org.jboss.spec.javax.ejb</groupId> 
    <artifactId>jboss-ejb-api_3.1_spec</artifactId> 
    <scope>provided</scope> 
</dependency> 

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>4.2.0.Final</version> 
    <scope>provided</scope> 
    <exclusions> 
    <exclusion> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
    </exclusion> 
    </exclusions> 
</dependency> 

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-jpamodelgen</artifactId> 
    <version>1.1.1.Final</version> 
    <scope>provided</scope> 
</dependency> 

<dependency> 
    <groupId>org.primefaces</groupId> 
    <artifactId>primefaces</artifactId> 
    <version>3.3.1</version> 
</dependency> 

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
</dependency> 

<dependency> 
    <groupId>org.jboss.arquillian.junit</groupId> 
    <artifactId>arquillian-junit-container</artifactId> 
    <scope>test</scope> 
</dependency> 

<dependency> 
    <groupId>org.jboss.arquillian.protocol</groupId> 
    <artifactId>arquillian-protocol-servlet</artifactId> 
    <scope>test</scope> 
</dependency> 

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

J'ai également essayé d'utiliser l'API interne JBoss JSF pour les tests sans effet sur l'erreur:

Mon modèle est dérivé des premières LazyDataModel

public class GenericLazyModel<T> extends LazyDataModel<T> 

LazyDataModel à son tour, est dérivé du javax.faces.model.DataModel

public abstract class LazyDataModel<T> extends DataModel<T> implements SelectableDataModel<T>, Serializable 

Le test est presque vide, je requsting une injection de mon modèle et vérifier null:

EDIT la ShrinkWrap l'initialisation inclut maintenant un faces-config.xml, tel que proposé par stefanglase. N'a pas changé la sortie d'erreur cependant.

@RunWith(Arquillian.class) 
    public class GenericLazyModelTest { 

     @Deployment 
     public static Archive<?> createTestArchive() { 

      return ShrinkWrap 
      .create(WebArchive.class, "genericLazyModelTest.war") 
       .addClasses(GenericLazyModel.class, Submitter.class, SubmitterPK.class, 
          Ordering.class) 
       .addClasses(GenericDao.class, Resources.class) 
       .addAsResource("META-INF/persistence.xml", "META-INF/persistence.xml") 
       .addAsWebInfResource(new StringAsset("<faces-config version=\"2.0\"/>"), "faces-config.xml")        
       .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml"); 
     } 

     @Inject 
     GenericLazyModel<Submitter> model; 

     @Before 
     public void before() { 
      Assert.assertNotNull(model); 
      model.setKlazz(Submitter.class); 
     } 

Je l'exécute sur Jboss 7.1.0.Final.
Des idées sur ce qui pourrait être le problème et comment le résoudre?

Merci

Répondre

1

Il vous manque le faces-config.xml dans votre déploiement. La spécification Java EE 6 nécessite qu'un descripteur faces-config.xml soit présent dans votre répertoire WEB-INF pour déclencher JSF.

Contrairement à beans.xml que vous avez déjà inclus le descripteur faces-config.xml ne peut pas être un fichier vide. Il doit contenir au moins le noeud racine et l'attribut version pour spécifier la version JSF utilisée.

Vous devez ajouter le code suivant à votre constructeur de ShrinkWrap:

.addAsWebInfResource(new StringAsset("<faces-config version=\"2.0\"/>"), "faces-config.xml"); 
+0

Merci pour la recherche en elle. Cela m'a peut-être sauvé de plus de problèmes, mais malheureusement, cela n'a eu aucune influence sur ClassFormatError. Je vais éditer la question pour inclure les faces-config – kostja

Questions connexes