2012-08-07 278 views
0

我想对以JSF API为根的数据模型执行arquillian测试。我收到此错误:如何为JSF类编写Arquillian测试

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 

简单的Arquillian测试,不涉及JSF,但JPA和EJB API的运行正常。
研究网络表明,一个常见的原因是使用太阳的残端EE APIs,如herehere所述。

我绝对没有使用它们。这里是我的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> 

我也试图以用于测试的内部JBoss的JSF API有关错误没有影响:

我的模型来源于底物LazyDataModel

public class GenericLazyModel<T> extends LazyDataModel<T> 

LazyDataModel依次从javax.faces.model.DataModel

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

得出的测试大部分是空的,我requsting我的模型的注入和检查null

编辑的拆封现在初始化包括一个faces-config.xml,由stefanglase提议。虽然没有改变错误输出。

@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); 
     } 

我在Jboss 7.1.0上运行这个.Final。
关于可能是什么问题以及如何解决问题的想法?

谢谢

回答

1

你缺少在部署中faces-config.xml。 Java EE 6规范要求您的WEB-INF目录中存在faces-config.xml描述符以触发JSF。

beans.xml不同,您已经包含的faces-config.xml描述符不能是空文件。它必须至少包含根节点和版本属性以指定正在使用的JSF版本。

所以,你需要将下面的代码添加到您的拆封建设者:

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

感谢您寻找到它。它可能为我解决了更多问题,但不幸的是它对ClassFormatError没有影响。我将编辑问题以包含faces-config – kostja 2012-08-07 10:45:13