2012-09-27 13 views
5

Tôi sẽ kiểm tra EJB của mình bằng EJBContainer được nhúng của TomEE.Thử nghiệm EJB với TomEE nhúng EJBContainer api: ngoại lệ java.lang.ClassFormatError

Đây là JUnit tôi trường hợp thử nghiệm bộ xương:

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 
    } 

} 

Và đây là những dependecies maven tôi:

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

Khi tôi bắt đầu lớp thử nghiệm, phương pháp EJBContainer.createEJBContainer() ném một java .lang.ClassFormatError ngoại lệ:

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) 

Tôi làm cách nào?

Trả lời

10

Tôi đã đọc tại liên kết này, https://stackoverflow.com/a/3416368/1412839, rằng sự cố là thứ tự của phụ thuộc maven.

tôi phải tuyên bố đầu tiên tomee nhúng tạo tác, và sau khi api JavaEE, theo cách này:

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

Nó hoạt động.

+0

Vậy đó! Bây giờ trong năm 2016 phiên bản là: 1.7.3

3

bạn có thể thay thế javax: javaee-api (jar bị hỏng) bởi org.apache.openejb: javaee-api: 6.0-4 quá và nó luôn hoạt động;)

Các vấn đề liên quan