2010-09-30 5 views
6

Dostaję dziwny błąd, gdy próbuję testować jednostkę klasy Java obsługującej komponenty JSF (javax.faces.model.SelectItem). Błąd pojawia to:Błąd testu jednostkowego (JSF): atrybut Absent Code w metodzie, która nie jest natywna lub abstrakcyjna

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) 
     ... 

Następnie sięga mojego kodu (w ItemOptionsHandler.java):
SelectItem [] items = new SelectItem [itemList.size()];

O co chodzi w tym błędzie?

Dziękuję za pomoc!

To jest klasa chcę testu:

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

To jest 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; 
     } 


    } 
} 

Oto niektóre z zależności:

<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> 

Odpowiedz

3

Używasz Maven rozwiązać zależności? Jeśli tak, tutaj wydaje się być odpowiedź: http://weblogs.java.net/blog/ludo/archive/2007/01/java_ee_5_apis.html

Można pobrać .jar i używać go z dysku:

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

Tak Używam Mavena z centralnego archiwum wewnątrz organizacji. Dodałem niektóre z moich zależności powyżej. – Jojje

+0

Co zaleca się robić? – Jojje

+0

Myślę, że powinieneś pobrać brakujący słoik i użyć go, nie z repozytorium maven. – amorfis

1

jeśli trzeba tylko serwletu specyfikacją 2.5 można użyć tego:

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

See Megadix

1

Praca z JBoss 6.3 miałem aby dodać wpis do mojego 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> 
Powiązane problemy