4

私は今しばらく立ち往生しています。私はたくさん検索しましたが、postgres データベースに対してエンティティークラスまたは JPA 操作をテストする最も簡単な方法を見つけることができません。Spring や Mockito などを使用する方法を見つけましたが、純粋な Java を使用する最も簡単な方法を見つけることができません。

次の JUnit テストがあります。

public class ModelConverterTest {

    private static EntityManagerFactory emf;
    private static EntityManager em;


    public ModelConverterTest() {
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
        emf = Persistence.createEntityManagerFactory("PU");
        em = emf.createEntityManager(); // Retrieve an application managed entity manager
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
        em.close();
        emf.close(); //close at application end
    }

    @Before
    public void setUp() {
         ...    
    }

    @After
    public void tearDown() {
    }

    /**
     * Test of SIMModelToModel method, of class ModelConverter.
     */
    @Test
    public void testSIMModelToModel() {
        System.out.println("SIMModelToModel");
        SIMModel simModel = new PESMModel();
        simModel.addState(testState);
        Model expResult = null;
        Model result = ModelConverter.SIMModelToModel(em, simModel);
        assertTrue(expResult!=null);
        // TODO review the generated test code and remove the default call to fail.
        //fail("The test case is a prototype.");
    }
}

実行すると、次のエラーが表示されます。

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/persistence/PersistenceContextType
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:787)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:447)
    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.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2442)
    at java.lang.Class.getDeclaredMethods(Class.java:1808)
    at sun.reflect.annotation.AnnotationType$1.run(AnnotationType.java:104)
    at sun.reflect.annotation.AnnotationType$1.run(AnnotationType.java:101)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.reflect.annotation.AnnotationType.<init>(AnnotationType.java:100)
    at sun.reflect.annotation.AnnotationType.getInstance(AnnotationType.java:84)
    at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:221)
    at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:88)
    at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:70)
    at java.lang.reflect.Field.declaredAnnotations(Field.java:1033)
    at java.lang.reflect.Field.getDeclaredAnnotations(Field.java:1026)
    at java.lang.reflect.AccessibleObject.getAnnotations(AccessibleObject.java:196)
    at org.junit.runners.model.FrameworkField.getAnnotations(FrameworkField.java:26)
    at org.junit.runners.model.TestClass.addToAnnotationLists(TestClass.java:52)
    at org.junit.runners.model.TestClass.<init>(TestClass.java:45)
    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.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:51)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)

私のpersistence.xmlファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="PU" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/modelsystemdb</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties/>
  </persistence-unit>
</persistence>

テストを実行するにはどうすればよいですか?

4

5 に答える 5

3

Maven リポジトリ内の不具合のある Java EE 6 API に関するトラブルの引用と、Adam Bien によるソリューション:

使用する代わりに

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

代替 (geronimo、jboss など) の依存関係を使用する必要があります。

<dependency>
   <groupId>org.apache.geronimo.specs</groupId>
   <artifactId>geronimo-ejb_3.1_spec</artifactId>
   <version>1.0</version>
   <scope>provided</scope>
</dependency>
<dependency>
   <groupId>org.apache.geronimo.specs</groupId>
   <artifactId>geronimo-jpa_2.0_spec</artifactId>
   <version>1.0</version>
   <scope>provided</scope>
</dependency>
于 2012-07-24T16:39:29.280 に答える
1

テストで JPA を使用する場合は、実行時にクラスパスに JPA プロバイダーが必要です。に対してコンパイルできますがjavaee-api、実行時に実際のライブ プロバイダーが必要です。

GlassFish を使用しているとのことです。これはプロバイダーとして EclipseLink を使用するため、テストでも同じことを行うのが理にかなっています。Maven を介して EclipseLink を使用する方法については、Wiki に情報があります。

于 2012-07-24T18:00:58.150 に答える
0

私の場合、プロジェクトの実行構成/クラスパスの下で、[編集] をクリックし、[エクスポートされたエントリのみを含める] をオンにします。

于 2014-11-24T10:52:31.930 に答える