Java 测试Spring MVC web应用程序时切换数据库?
Spring项目(以其生产形式)将使用MySQL数据库。我希望在项目上运行的测试使用高超音速内存 我在test/resources文件夹中添加了以下新文件Java 测试Spring MVC web应用程序时切换数据库?,java,database,spring,testing,spring-mvc,Java,Database,Spring,Testing,Spring Mvc,Spring项目(以其生产形式)将使用MySQL数据库。我希望在项目上运行的测试使用高超音速内存 我在test/resources文件夹中添加了以下新文件 数据库.properties applicationContext.xml test-persistence.xml 但是,该项目抛出了一个MYSQL语法错误(它试图以某种方式将MYSQL用于高超音速) 考虑到我是一个完全的初学者(春季的第一个项目),我想知道切换数据库进行测试的步骤是什么(我可能做错了什么) 乐: 这是我在运行maven
- 数据库.properties
- applicationContext.xml
- test-persistence.xml
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
测试运行:9,失败:0,错误:9,跳过:0,经过的时间:12.29秒搜索org.hibernate.dialent.mysqldialent
,并将其替换为org.hibernate.dialent.hsqldiante
()
[编辑]错误显示“无法打开连接”。检查JDBC URL、用户+密码以及输出中的更多错误。搜索org.hibernate.dialogue.mysqldialogue
,并将其替换为org.hibernate.dialogue.hsqldatalogue
()
[编辑]错误显示“无法打开连接”。检查JDBC URL、用户+密码以及输出中的更多错误。我假设这就是原始applicationContext.xml的外观(还假设persistence.xml文件定义了一个jndi名称为“testEM”的persistence单元)
出于测试目的,您基本上需要覆盖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>
我假设这就是原始applicationContext.xml的外观(还假设persistence.xml文件定义了一个jndi名称为“testEM”的persistence单元)
出于测试目的,您基本上需要覆盖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>
感谢您的快速回复。但是,在test/test-persistence.xml文件中,我已经将org.hibernate.dialent设置为hsqldiante。我需要从MySQL切换到高超音速…啊。我把你的问题理解为“我想将fom HSQL升级到MySQL”。好的,在这种情况下,将异常(带有堆栈跟踪)添加到您的问题中。感谢您的快速响应。但是,在test/test-persistence.xml文件中,我已经将org.hibernate.dialent设置为hsqldiante。我需要从MySQL切换到高超音速…啊。我把你的问题理解为“我想将fom HSQL升级到MySQL”。好的,在这种情况下,将异常(带有堆栈跟踪)添加到您的问题中。为什么在test-persistence.xml的第一个测试中使用com.MYSQL.jdbc.Driver值?如果我想用高超音速进行测试,我需要它吗?对不起,那是个错误。您必须将其替换为“org.hsqldb.jdbc.JDBCDriver”,并将hsqljdbc驱动程序jar添加到classpath.noobqquestion中。为什么在test-persistence.xml的第一个测试中使用com.MYSQL.jdbc.Driver值?如果我想用高超音速进行测试,我需要它吗?对不起,那是个错误。您必须将其替换为“org.hsqldb.jdbc.jdbdriver”,并将hsqljdbc驱动程序jar添加到类路径中。