2010-02-17 66 views
6

我有一個由Spring Roo爲我的域對象(和DAO ITD)生成的集成測試集合。如何運行Spring Roo針對Tomcat的不同數據庫生成測試?

他們似乎固定用「生產」的applicationContext.xml,它讀取database.properties並連接到我已經建立了與項目試驗MySQL數據庫架構:

privileged aspect AdvertIntegrationTest_Roo_IntegrationTest { 

    declare @type: AdvertIntegrationTest: @RunWith 
     (SpringJUnit4ClassRunner.class);  

    declare @type: AdvertIntegrationTest: @ContextConfiguration 
     (locations = "classpath:/META-INF/spring/applicationContext.xml"); 

的這樣做的結果是我的演示數據庫經常被這些測試填充垃圾。

我想更改配置,以便集成測試使用in-mem數據庫,並保持MySQL數據庫的獨立。目前,我能看到的唯一選擇是從現在開始刪除Roo註釋並自行管理這些測試,但我寧願讓Roo暫時處於循環狀態。

是否可以配置我的項目,因此「mvn tomcat」和「mvn test」命令使用單獨的數據庫,而不會破壞Spring Roo的設置?或者,對於我想要做的事情或許有更好的方法?

+0

更新:我從奔亞歷一些幫助在彈簧論壇(http://forum.springsource.org/showthread.php?p=284703#post284703),看來Spring Roo的還沒有提供任何內置的支持... – seanhodges 2010-02-18 13:45:45

回答

6

肖恩,

我一直在努力與同樣的事情。最後我把applicationContext.xml中的副本,測試/資源/ META-INF /彈簧和修改下面一行:

<context:property-placeholder location="classpath*:META-INF/spring/test/*.properties"/> 

在這種「測試」目錄屬性佔位點,我已經把另一配置hsqldb的database.properties。

最後,我不得不persistence.xml中的不同副本配置SQL方言(也applicationContext.xml中)

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence-for-tests.xml"/> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

我想,通過使用魔法的pom.xml一個更優雅的解決方案是可能的,但現在這似乎是我可以接受的解決方案。

漢斯

+0

我投了jira問題以及:) – 2010-02-19 10:07:06

+0

這是非常有用的,謝謝!你如何指示Roo測試使用「測試」applicationContext.xml?你修改了生成的AJ文件嗎? – seanhodges 2010-02-20 09:44:54

+0

不,我沒有修改任何aj文件,這不是必需的,也不推薦,因爲它們是由roo完全創建/管理的。 Roo將測試執行延期至maven。 maven只會選擇位於test/resources中的配置文件,因此位於類路徑中。 – 2010-02-20 17:12:42

1

肖恩,所有

我有同樣的問題,發現一個可能是大家有用件事。

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
    <persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 

    <!-- production persistence unit --> 
    <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> 
    ... 
    </persistence-unit> 
    <!-- test persistence unit --> 
    <persistence-unit name="testPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 
    ... 
    </persistence-unit> 
    </persistence> 

然後在您的applicationContext.xml(這一個用於測試)僅需要2個變化:

  1. 性質 persistence.xml中一個可以與不同的名稱,如定義多個持久性單元文件爲 「testPersistenceUnit」 在持久性加載形式META-INF /彈簧測試/ *

    <context:property-placeholder location="classpath*:META-INF/spring-test/*.properties"/> 
    
  2. persistenceUnitName來分。XML

    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
    <property name="persistenceUnitName" value="testPersistenceUnit"/> 
    <property name="dataSource" ref="dataSource"/> 
    

希望這將幫助別人是有許多答案有,但它是很難找出 您可以在一個persistence.xml中已經定義了多個persistenceUnits

Szymon

0

對我來說這些步驟工作得很好:

1)在你的src/main/resources/META-INF/persistence.xml添加一個新的持久性單元用於測試目的:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <!-- Production Database --> 
    <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /> 
     <!-- value="create" to build a new database on each run; value="update" to modify an existing database; value="create-drop" means the same as "create" but also drops tables when Hibernate closes; value="validate" makes no changes to the database --> 
     <property name="hibernate.hbm2ddl.auto" value="update" /> 
     <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" /> 
     <property name="hibernate.connection.charSet" value="UTF-8" /> 
     <!-- Uncomment the following two properties for JBoss only --> 
     <!-- property name="hibernate.validator.apply_to_ddl" value="false" /--> 
     <!-- property name="hibernate.validator.autoregister_listeners" value="false" /--> 
     </properties> 
    </persistence-unit> 

    <!-- Test Database --> 
    <persistence-unit name="persistenceUnitTest" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /> 
     <!-- value="create" to build a new database on each run; value="update" to modify an existing database; value="create-drop" means the same as "create" but also drops tables when Hibernate closes; value="validate" makes no changes to the database --> 
     <property name="hibernate.hbm2ddl.auto" value="create" /> 
     <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" /> 
     <property name="hibernate.connection.charSet" value="UTF-8" /> 
     <!-- Uncomment the following two properties for JBoss only --> 
     <!-- property name="hibernate.validator.apply_to_ddl" value="false" /--> 
     <!-- property name="hibernate.validator.autoregister_listeners" value="false" /--> 
     </properties> 
    </persistence-unit> 
</persistence> 

2)文件applicationContext.xmldatabase.propertiessrc/main/resources/META-INF/spring複製到src/test/resources/META-INF/spring(如果此文件夾不存在,創建它)。

3)更換src/test/resources/META-INF/spring/database.properties的內容是這樣的:

#Updated at Sat Sep 12 22:13:10 CEST 2015 
#Sat Sep 12 22:13:10 CEST 2015 
database.test.driverClassName=org.h2.Driver 
database.test.url=jdbc:h2:./src/test/resources/db/data 
database.test.username=sa 
database.test.password= 

4)applicationContext.xml文件重命名爲src/test/resources/META-INF/spring/applicationContext.xmltestApplicationContext.xml並改變其內容是這樣的(簡單地更改數據庫的數據庫引用。測試和persistenceUnitpersistenceUnitTestpersistenceUnitName屬性值)

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd   http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> 
    <context:property-placeholder location="classpath*:META-INF/spring/*.properties"/> 
    <context:spring-configured/> 
    <context:component-scan base-package="com.jitter.finance.analyzer"> 
     <context:exclude-filter expression=".*_Roo_.*" type="regex"/> 
     <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/> 
    </context:component-scan> 
    <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource"> 
     <property name="driverClassName" value="${database.test.driverClassName}"/> 
     <property name="url" value="${database.test.url}"/> 
     <property name="username" value="${database.test.username}"/> 
     <property name="password" value="${database.test.password}"/> 
     <property name="testOnBorrow" value="true"/> 
     <property name="testOnReturn" value="true"/> 
     <property name="testWhileIdle" value="true"/> 
     <property name="timeBetweenEvictionRunsMillis" value="1800000"/> 
     <property name="numTestsPerEvictionRun" value="3"/> 
     <property name="minEvictableIdleTimeMillis" value="1800000"/> 
    </bean> 
    <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 
    <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> 
    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
     <property name="persistenceUnitName" value="persistenceUnitTest"/> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 
</beans> 

5)最後,你可以測試你的類像這樣:

import org.junit.Test; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; 

@ContextConfiguration(locations = {"classpath*:/META-INF/spring/testApplicationContext*.xml"}) 
public class QuoteListTest extends AbstractJUnit4SpringContextTests { 
    @Test 
    public void checkQuote(){ 
     /* some code to test, this will interact with the defined database.test */ 
    } 
} 
相關問題