Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单元测试DAO在使用hsqldb和hibernate进行持久化时失败_Java_Hibernate_Junit_Jpa 2.0 - Fatal编程技术网

Java 单元测试DAO在使用hsqldb和hibernate进行持久化时失败

Java 单元测试DAO在使用hsqldb和hibernate进行持久化时失败,java,hibernate,junit,jpa-2.0,Java,Hibernate,Junit,Jpa 2.0,所以我整天都在解决这个问题,但我仍然无法解决它。如果我在JBoss7和mysql中运行它,这是可行的。我创建了一个test persistence.xml,它在连接属性上不同于我的产品,并且不使用jndi 我正在尝试让此代码在本地运行,但我遇到了问题,当我尝试使用em.persist(myUser)持久化User实体时,我得到了PropertyAccessException,堆栈跟踪显示hibernate正在尝试将User.id类型的long设置为(或a)用户对象 我不明白为什么会发生这种情况,

所以我整天都在解决这个问题,但我仍然无法解决它。如果我在JBoss7和mysql中运行它,这是可行的。我创建了一个test persistence.xml,它在连接属性上不同于我的产品,并且不使用jndi

我正在尝试让此代码在本地运行,但我遇到了问题,当我尝试使用
em.persist(myUser)
持久化
User
实体时,我得到了
PropertyAccessException
,堆栈跟踪显示hibernate正在尝试将
User.id
类型的
long
设置为(或a)
用户
对象

我不明白为什么会发生这种情况,你能解释一下为什么hibernate会感到困惑吗

pom包含所有的应用程序依赖项,其中大多数可能是无关的,但我想我可能在某个地方也有一个重复的包

我还查找了关于jboss as 7.1.1.Final中使用这些依赖项的哪些版本的一些细节,但运气不太好

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="testing" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <class>mypackage.beans.User</class>

    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
        <property name="hibernate.hbm2ddl.auto" value="create"/>
        <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
        <property name="hibernate.connection.username" value="sa"/>
        <property name="hibernate.connection.password" value=""/>
        <property name="hibernate.connection.url" value="jdbc:hsqldb:mem:test"/>
        <property name="hibernate.showSql" value="true"/>
        <property name="hibernate.archive.autodetection" value="true"/>
    </properties>
</persistence-unit>
</persistence>
聚甲醛

例外情况

javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of mypackage.beans.User.id
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1377)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1306)
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:871)
    at mypackage.dao.UserDao.getOrCreate(UserDao.java:39)
    at mypackage.filters.UserParser.parse(UserParser.java:26)
    at mypackage.filters.UserParserTest.testParse(UserParserTest.java:71)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:86)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:94)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:101)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
    Caused by: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of mypackage.beans.User.id
    at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:62)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:341)
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4425)
    at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4147)
    at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:209)
    at org.hibernate.event.internal.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:495)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:118)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:844)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:819)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:823)
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:865)
    ... 35 more
    Caused by: java.lang.IllegalArgumentException: Can not set long field     mypackage.beans.User.id to mypackage.beans.User
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
    at sun.reflect.UnsafeLongFieldAccessorImpl.getLong(UnsafeLongFieldAccessorImpl.java:60)
    at sun.reflect.UnsafeLongFieldAccessorImpl.get(UnsafeLongFieldAccessorImpl.java:36)
    at java.lang.reflect.Field.get(Field.java:372)
    at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:59)
    ... 46 more

在今天的进一步测试之后,我发现问题是由
Powermock
引起的,在没有dao的情况下直接测试了实体类,并且模拟测试通过了。一旦我在测试中添加模拟,测试就会失败

我通过修改
@PowerMockIgnore
注释并添加我所有JPA实体所在的包修复了这个问题。这个测试现在通过了

@RunWith(PowerMockRunner.class)
@PrepareForTest(DaoLoader.class)
@PowerMockIgnore({"javax.persistence.*","mypackage.beans.*"})
public class UserParserTest {

private static EntityManagerFactory emf;
private UserParser parser;
private UserDao dao;
private EntityManager em;

@BeforeClass
public static void initializeEMF(){
    emf = Persistence.createEntityManagerFactory("testing");
}

@AfterClass
public static void closeEntityManagerFactory() {
    emf.close();
}

@Before
public void setUp() throws Exception {
    em = emf.createEntityManager();
    em.getTransaction().begin();
    dao = new UserDao(em);
    PowerMock.mockStatic(DaoLoader.class);
    EasyMock.expect(DaoLoader.loadDao("java:module/UserDao")).andReturn(dao);

    PowerMock.replay(DaoLoader.class);

    parser = new UserParser();
}

@After
public void rollbackTransaction() {
    if (em.getTransaction().isActive()) {
        em.getTransaction().rollback();
    }

    if (em.isOpen()) {
        em.close();
    }

    PowerMock.verify(DaoLoader.class);
}

@Test
public void testParse() throws Exception {
    parser.parse("test_username");
}

您可以尝试将原语long更改为long吗?是的,这与错误没有任何区别,应该已经提到我以前尝试过
int
Integer
并且我在powermock网站上为此打开了一个问题,即使这仅仅意味着添加到文档中
@RunWith(PowerMockRunner.class)
@PrepareForTest(DaoLoader.class)
@PowerMockIgnore("javax.persistence.*")
public class UserParserTest {

private static EntityManagerFactory emf;
private UserParser parser;
private UserDao dao;
private EntityManager em;

@BeforeClass
public static void initializeEMF(){
    emf = Persistence.createEntityManagerFactory("testing");
}

@AfterClass
public static void closeEntityManagerFactory() {
    emf.close();
}

@Before
public void setUp() throws Exception {
    em = emf.createEntityManager();
    em.getTransaction().begin();
    dao = new UserDao(em);
    PowerMock.mockStatic(DaoLoader.class);
    EasyMock.expect(DaoLoader.loadDao("java:module/UserDao")).andReturn(dao);

    PowerMock.replay(DaoLoader.class);

    parser = new UserParser();
}

@After
public void rollbackTransaction() {
    if (em.getTransaction().isActive()) {
        em.getTransaction().rollback();
    }

    if (em.isOpen()) {
        em.close();
    }

    PowerMock.verify(DaoLoader.class);
}

@Test
public void testParse() throws Exception {
    parser.parse("test_username");
}
javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of mypackage.beans.User.id
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1377)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1306)
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:871)
    at mypackage.dao.UserDao.getOrCreate(UserDao.java:39)
    at mypackage.filters.UserParser.parse(UserParser.java:26)
    at mypackage.filters.UserParserTest.testParse(UserParserTest.java:71)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:86)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:94)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:101)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
    Caused by: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of mypackage.beans.User.id
    at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:62)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:341)
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4425)
    at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4147)
    at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:209)
    at org.hibernate.event.internal.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:495)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:118)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:844)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:819)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:823)
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:865)
    ... 35 more
    Caused by: java.lang.IllegalArgumentException: Can not set long field     mypackage.beans.User.id to mypackage.beans.User
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
    at sun.reflect.UnsafeLongFieldAccessorImpl.getLong(UnsafeLongFieldAccessorImpl.java:60)
    at sun.reflect.UnsafeLongFieldAccessorImpl.get(UnsafeLongFieldAccessorImpl.java:36)
    at java.lang.reflect.Field.get(Field.java:372)
    at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:59)
    ... 46 more
@RunWith(PowerMockRunner.class)
@PrepareForTest(DaoLoader.class)
@PowerMockIgnore({"javax.persistence.*","mypackage.beans.*"})
public class UserParserTest {

private static EntityManagerFactory emf;
private UserParser parser;
private UserDao dao;
private EntityManager em;

@BeforeClass
public static void initializeEMF(){
    emf = Persistence.createEntityManagerFactory("testing");
}

@AfterClass
public static void closeEntityManagerFactory() {
    emf.close();
}

@Before
public void setUp() throws Exception {
    em = emf.createEntityManager();
    em.getTransaction().begin();
    dao = new UserDao(em);
    PowerMock.mockStatic(DaoLoader.class);
    EasyMock.expect(DaoLoader.loadDao("java:module/UserDao")).andReturn(dao);

    PowerMock.replay(DaoLoader.class);

    parser = new UserParser();
}

@After
public void rollbackTransaction() {
    if (em.getTransaction().isActive()) {
        em.getTransaction().rollback();
    }

    if (em.isOpen()) {
        em.close();
    }

    PowerMock.verify(DaoLoader.class);
}

@Test
public void testParse() throws Exception {
    parser.parse("test_username");
}