2010-06-02 65 views
0

我正在使用JUnit 4通过Spring(注释)和JPA(休眠)来测试Dao Access。数据源通过带有ORacle(后端)的JNDI(Weblogic)进行配置。此持久性仅使用名称和RESOURCE_LOCAL事务类型配置没有定义[javax.persistence.EntityManager]类型的唯一bean

应用程序上下文文件包含用于注释,JPA配置,事务以及用于注释检测的默认包和配置的注释。 我使用Junit4像这样:


的ApplicationContext

<bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="workRequest"/> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="databasePlatform" value="${database.target}"/> 
      <property name="showSql" value="${database.showSql}" /> 
      <property name="generateDdl" value="${database.generateDdl}" /> 
     </bean> 
    </property> 
</bean> 

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName"> 
     <value>workRequest</value> 
    </property> 
    <property name="jndiEnvironment"> 
     <props> 
      <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop> 
      <prop key="java.naming.provider.url">t3://localhost:7001</prop> 
     </props> 
    </property> 
</bean> 

<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 


的JUnit的TestCase

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:applicationContext.xml" }) 
public class AssignmentDaoTest { 
     private AssignmentDao assignmentDao; 
     @Test 
     public void readAll() { 
      assertNotNull("assignmentDao cannot be null", assignmentDao); 
      List<Assignment> assignments = assignmentDao.findAll(); 
      assertNotNull("There are no assignments yet", assignments); 
     } 
} 


不管什么样的变化我让我得到:

No unique bean of type [javax.persistence.EntityManager] is defined

任何暗示什么,这可能是。我在eclipse中运行测试。

回答

2

你的Spring上下文有一个使用LocalContainerEntityManagerFactoryBean的bean定义。这会创建一个EntityManagerFactory,而不是EntityManager

AssignmentDao需要与EntityManagerFactory连线。

或者,你可以用LocalEntityManagerFactoryBean,这直接创建EntityManager更换LocalContainerEntityManagerFactoryBean。但是,你需要小心,它有一些缺点。请参阅Spring docs的这一部分,以获取选项的完整说明。

这很令人困惑,因为JPA和Spring的命名约定相互重叠,所以命名这些类是一个真正的bug。

+0

assignmentDao是通过注释连线的,那个在最后一分钟被插入以进行调试,无视。到目前为止,我发现的所有示例都使用配置中的EntityManagerFactory和注入的EntityManager。我用Mysql w/o JUnit-Spring Integration以这种方式使用它,它工作。 – user294241 2010-06-02 21:04:37

+0

@sebajb:阅读我发布的链接。第13.5.2节谈到以你需要的方式组合东西。 – skaffman 2010-06-02 21:19:55

+0

谢谢。我需要阅读文档,看看有什么适合我的需求。然而LocalEntityManagerFactoryBean似乎对我的需求太有限了。我只需要注入一个EntityManagerFactory。 – user294241 2010-06-02 21:51:43