2012-09-27 26 views
5

Probaría mi EJB con TomEE embedded EJBContainer.Pruebas EJB con TomEE incrustado EJBContainer api: java.lang.ClassFormatError excepción

Ésta es mi caso de prueba JUnit esqueleto:

package com.xxx.indexer.scheduler.service; 

import java.util.Properties; 

import javax.ejb.embeddable.EJBContainer; 
import javax.naming.NamingException; 

import org.junit.AfterClass; 
import org.junit.Before; 
import org.junit.BeforeClass; 
import org.junit.Test; 

import com.xxx.indexer.scheduler.AbstractTest; 

public class BookingAuditServiceImplTest extends AbstractTest { 

    private static EJBContainer container; 

    @BeforeClass 
    public static void start() { 
     final Properties props = new Properties(); 
     props.setProperty(EJBContainer.PROVIDER, "tomee-embedded"); 
     container = EJBContainer.createEJBContainer(props); 
    } 

    @AfterClass 
    public static void stop() { 
     container.close(); 
    } 

    @Before 
    public void inject() throws NamingException { 
     container.getContext().bind("inject", this); 
    } 

    @Test 
    public void test() { 
     // TODO 
    } 

} 

Y estos son mis dependecies Maven:

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.10</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>javax</groupId> 
    <artifactId>javaee-api</artifactId> 
    <version>6.0</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.apache.openejb</groupId> 
    <artifactId>tomee-embedded</artifactId> 
    <version>1.0.0</version> 
    <scope>test</scope> 
</dependency> 

Cuando comienzo a la clase de prueba, el método EJBContainer.createEJBContainer() lanza una java .lang.ClassFormatError excepción:

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/ejb/embeddable/EJBContainer 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
at java.lang.Class.getDeclaredFields0(Native Method) 
at java.lang.Class.privateGetDeclaredFields(Class.java:2308) 
at java.lang.Class.getDeclaredFields(Class.java:1760) 
at org.junit.runners.model.TestClass.<init>(TestClass.java:44) 
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:73) 
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:55) 
at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:13) 
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) 
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

¿Cómo puedo hacer?

Respuesta

10

Leí en este enlace, https://stackoverflow.com/a/3416368/1412839, que el problema está en el orden de las dependencias de maven.

que tiene que declarar la primera tomee incrustado artefacto, y después de la API de Java EE, de esta manera:

<dependency> 
    <groupId>org.apache.openejb</groupId> 
    <artifactId>tomee-embedded</artifactId> 
    <version>1.0.0</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>javax</groupId> 
    <artifactId>javaee-api</artifactId> 
    <version>6.0</version> 
    <scope>provided</scope> 
</dependency> 

Funciona.

+0

eso es todo! Ahora en 2016 la versión es: 1.7.3

3

se puede reemplazar javax: JavaEE-api (frasco roto) por org.apache.openejb: JavaEE-api: 6,0-4 también y siempre funciona;)

Cuestiones relacionadas