2012-11-08 44 views
0

Spring項目(以其生產形式)將使用MySQL數據庫。我希望項目上運行的測試使用HYPERSONIC_IN_MEMORY。在測試Spring MVC Web應用程序時切換數據庫?

我在test/resources文件夾中添加了下列新文件。

  • database.properties
  • 的applicationContext.xml
  • 測試的persistence.xml

然而,該項目將引發MYSQL語法錯誤(它試圖以某種方式使用MySQL與高超音速)。

考慮到我是一個總的初學者(Spring的第一個項目),我想知道切換數據庫進行測試的步驟(我可能做錯了什麼)。

LE: 這是行家運行測試時什麼我越來越:

Tests run: 9, Failures: 0, Errors: 9, Skipped: 0, Time elapsed: 12.29 sec <<< FAILURE! 
testCountAllAccountAllocations(com.mms.pone.portal.domain.AccountAllocationIntegrationTest) Time elapsed: 11.813 sec <<< ERROR! 
org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection 
    at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:427) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371) 
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.startTransaction(TransactionalTestExecutionListener.java:513) 
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.startNewTransaction(TransactionalTestExecutionListener.java:271) 
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:164) 
    at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:358) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164) 
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110) 
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:172) 
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:104) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:70) 
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1315) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1397) 
    at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:63) 
    at org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:70) 
    at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:377) 
    ... 31 more 
Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection 

而那些多很多。我感覺Maven沒有使用新的xml文件,仍然堅持使用舊的。

我能想出來的任何方式嗎?

回答

1

我假設這是你原來的applicationContext.xml的樣子(也假設persistence.xml文件定義了persitence單元JNDI名稱「testEM」)

<jee:jndi-lookup id="entityManagerFactory" jndi-name="java:comp/env/testEM" /> 

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

出於測試目的,你基本上需要重寫如何創建entityManagerFactory。 在你的applicationContext-test.xml文件中覆蓋'entityManagerFactory'的bean定義,如下面的代碼片段所示。在src/test/resources中創建一個'META-INF/test-persistence.xml',創建一個到hsql內存數據庫的連接。

測試的persistence.xml

<persistence-unit name="testPu"> 
    <properties> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
     <property name="hibernate.connection.password" value=""/> 
     <property name="hibernate.connection.url" value="jdbc:hsqldb:mem:schemaname"/> 
     <property name="hibernate.connection.username" value="sa"/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> 
    </properties> 
</persistence-unit> 

的applicationContext-的test.xml

<!-- Import the original applicationContext and override properties for test purposes --> 
<import resource="classpath:applicationContext" /> 

<!-- In our case, we need to override entityManagerFactory definition --> 
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceXmlLocation" value="classpath*:META-INF/test-persistence.xml" /> 
    <!-- other properties (omitted) --> 
</bean> 
+0

Noob qquestion。爲什麼你在test-persistence.xml中的第一個中使用com.MYSQL.jdbc.Driver的值?如果我想僅使用超音速測試,我是否需要它? – Eugen

+1

對不起,這是一個錯誤。你將不得不用'org.hsqldb.jdbc替換它。JDBCDriver'並將hsql jdbc驅動程序jar添加到您的類路徑中。 – Sashi

2

搜索org.hibernate.dialect.MySQLDialectorg.hibernate.dialect.HSQLDialectdocs)替換它

[編輯]錯誤說 「無法打開連接」。檢查JDBC URL,用戶名+密碼以及輸出中的更多錯誤。

+0

感謝您的非常快速的響應。但是,我已經在test/test-persistence.xml文件中將org.hibernate.dialect設置爲HSQLDialect。我需要從MySQL切換到HYPERSONIC ... – Eugen

+1

啊。我把你的問題看成是「我想把HSQL升級到MySQL」。好的,在這種情況下,將異常(使用堆棧跟蹤)添加到您的問題。 –

+0

用stacktrace編輯的問題添加... – Eugen

相關問題