2014-01-23 42 views
5

我正在用Hibernate學習Spring。我有一個名爲Person,PersonDao接口的Hibernate註釋註解的POJO模型類,它是hibernate實現和一個PersonService類。我使用註釋,因此它們沒有在我的spring-config.xml中定義爲bean。現在我想爲我的PersonService類編寫一些JUnit4測試,但是我想在測試時使用不同的數據庫。這裏是我的春天-config.xml中如何在春季提供測試數據源?

<context:component-scan base-package="org.example" /> 
<tx:annotation-driven /> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost/example" /> 
    <property name="username" value="root" /> 
    <property name="password" value="pwd" /> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
     </props> 
    </property> 
    <property name="annotatedClasses"> 
     <list> 
      ... 
     </list> 
    </property> 
</bean> 

而且我想在我的測試的jdbc:使用本地主機///example_test數據庫:MySQL的。我如何實現這一目標?

+0

單元測試不應該使用一個數據庫作爲其不應該測試數據庫,但你的班級,而不是嘗試像mockito http://code.google.com/p/mockito/ –

回答

3
  • jdbc:mysql://localhost/example移動到配置文件(db.properties

    database.uri = JDBC:MySQL的://本地主機/示例

  • 在類路徑將這個文件的某處(即src/main/resources

  • 在Spring環境中設置屬性佔位符並使用數據庫URI屬性密鑰

    <context:property-placeholder location="classpath:db.properties" /> 
    ... 
    <property name="url" value="${database.uri}" /> 
    
  • 在測試類路徑相同的名稱創建配置文件(src/test/resources

  • 更改數據庫URI屬性測試值(jdbc:mysql://localhost/example_test

    database.uri = JDBC:MySQL的://本地主機/ example_test

利潤

0

你可以做這樣的事情,並指定另一個春天上下文與其他數據源,會話工廠,等等

@ContextConfiguration(locations = { 
    "/spring-context-test.xml", 
}) 
public class MyTestClass extends AbstractTransactionalJUnit4SpringContextTests 
{ 

} 
1

dataSource提取定義成單獨的XML文件,並提供不同版本的文件時的創建用於測試和生產的應用上下文(即用於生產的spring-config.xmldatasource-prod.xml以及用於測試的spring-config.xmldatasource-test.xml)。

或者,您可以使用profiles區分測試環境和生產環境,同時使用同一組配置文件。

另一種方法是保留dataSource的通用定義,但將其屬性外化爲屬性文件。但是它不會允許您針對不同的環境使用完全不同的定義(例如,生產中的連接池和用於測試的簡單DriverManagerDataSource)。