2010-09-30 17 views
6

Je reçois une erreur étrange lorsque j'essaie de tester une classe Java traitant des composants JSF (javax.faces.model.SelectItem). L'erreur que je reçois est la suivante:Erreur de test unitaire (JSF): Attribut de code absent dans une méthode qui n'est pas native ou abstraite

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/faces/model/SelectItem 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:616) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) 
     at java.net.URLClassLoader.access$000(URLClassLoader.java:58) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:197) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
     ... 

Il atteint alors mon code (en ItemOptionsHandler.java):
SelectItem [] = new articles SelectItem [itemList.size()];

De quoi s'agit-il? ???

Reconnaissant à l'aide!

C'est la classe que je veux tester:

package foo.web.converters; 

import java.io.Serializable; 
import java.util.List; 
import javax.ejb.EJB; 
import javax.faces.model.SelectItem; 

import foo.business.facade.ItemFacade; 
import foo.model.MyType; 


public class ItemOptionsHandler implements Serializable { 

    @EJB 
    private ItemFacade facade; 

    public void setFacade(ItemFacade facade) { 
     this.facade = facade; 
    } 

    public SelectItem[] getSupplierItems() { 

     List<MyType> itemList = facade.getSupplierItems(); 
     SelectItem[] items = new SelectItem[itemList.size()]; 
     int i = 0; 

     // more stuff 

     return items; 
    } 
} 

C'est le test:

package foo.web.converters; 

import java.util.ArrayList; 
import java.util.List; 
import javax.faces.model.SelectItem; 
import org.junit.After; 
import org.junit.AfterClass; 
import org.junit.Before; 
import org.junit.BeforeClass; 
import org.junit.Test; 
import static org.junit.Assert.*; 
import foo.facade.ItemFacade; 
import foo.model.MyModel; 

public class ItemOptionsHandlerTest { 

    private ItemOptionsHandler instance = null; 

    public ItemOptionsHandlerTest() { 
    } 

    @BeforeClass 
    public static void setUpClass() throws Exception { 
    } 

    @AfterClass 
    public static void tearDownClass() throws Exception { 
    } 

    @Before 
    public void setUp() { 
     instance = new ItemOptionsHandler(); 
     instance.setFacade(new BusinessFacadeTemp()); 
    } 

    @After 
    public void tearDown() { 
    } 

    @Test 
    public void testGetSupplierItems() { 
     System.out.println("getSupplierGroups"); 
     SelectItem[] expResult = null; 
     SelectItem[] result = instance.getSupplierItems(); 
     assertEquals(expResult, result); 
    } 

    private class BusinessFacadeTemp implements ItemFacade { 
     @Override 
     public List<MyTest> getSupplierItems() { 
     return null; 
     } 


    } 
} 

Voici quelques-unes des dépendances:

<dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-web-api</artifactId> 
     <version>6.0</version> 
     <scope>provided</scope> 
     </dependency> 


     <dependency> 
     <groupId>javax.annotation</groupId> 
     <artifactId>jsr250-api</artifactId> 
     <version>1.0</version> 
     </dependency> 

     <dependency> 
     <groupId>javax.faces</groupId> 
     <artifactId>jsf-api</artifactId> 
     <version>1.2</version> 
     </dependency> 

     <dependency> 
     <groupId>javax.faces</groupId> 
     <artifactId>jsf-impl</artifactId> 
     <version>1.2-b19</version> 
     </dependency> 

Répondre

3

Utilisez-vous maven résoudre les dépendances? Si oui, voici semble être une réponse: http://weblogs.java.net/blog/ludo/archive/2007/01/java_ee_5_apis.html

Vous pouvez télécharger .jar et de l'utiliser à partir de votre disque:

<dependency> 
    <groupId>javax</groupId> 
    <artifactId>javaee-web-api</artifactId> 
    <version>6.0</version> 
    <scope>provided</scope> 
    <systemPath>/path/to/your/jar</systemPath> 
</dependency> 
+0

Oui J'utilise Maven à partir d'une archive centrale au sein de l'organisation. J'ai ajouté quelques unes de mes dépendances ci-dessus. – Jojje

+0

Que recommandez-vous de faire? – Jojje

+0

Je pense que vous devriez télécharger le fichier manquant et l'utiliser, pas dans le dépôt maven. – amorfis

1

Si vous avez juste besoin spec servlet 2.5 vous pouvez utiliser ceci:

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>servlet-api</artifactId> 
    <version>2.5</version> 
</dependency> 

See Megadix

1

Travailler avec JBoss 6.3 J'ai dû ajouter cette entrée à mon pom.xml

<dependency> 
     <groupId>org.jboss.spec.javax.faces</groupId> 
     <artifactId>jboss-jsf-api_2.1_spec</artifactId> 
     <version>2.1.29.Final</version> 
     <scope>test</scope> 
    </dependency>