2010-06-02 60 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

相關問題