java - JUnit、JPA、Hibernate 和 Postgres : How to test?

标签 java hibernate jakarta-ee junit jpa-2.0

我已经被困了一段时间了。我搜索了很多,但找不到针对 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>

我应该怎么做才能使测试运行?

最佳答案

引用 Trouble With Crippled Java EE 6 APIs in Maven Repository And The Solution亚当·比恩:

Instead of using

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

You should use alternative (geronimo, jboss etc.) dependencies:

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

关于java - JUnit、JPA、Hibernate 和 Postgres : How to test?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11635402/

相关文章:

java - SQL with java 搜索子字符串

java - 仅当@Test1通过时才运行@Test2

java - 如何计算 Math.pow(10, n),其中 n>=10000

java - 如何禁用 JPA 2 回调方法和实体监听器

maven - 在 WEB-INF/lib 内的 JAR 中找不到 CDI 实例

java - 如何在 Java Swing 中构建 Google-chrome 选项卡和菜单栏界面?

java - PostgreSQL 错误,类型 Java_Object 不存在

java - spring 应用程序的 hibernate 配置错误?

java - 创建了计划 cron 作业主类作为可运行的 jar

java - 如何使用 Weblogic 在 Java Web 应用程序中使用 JDBC 模块