持续集成之路——数据访问层单元测试遇到的问题(4)

发表于:2013-07-22来源:Csdn作者:mydeman点击数: 标签:持续集成
DirtiesContextTestExecutionListener.class, CustomTransactionDbUnitTestExecutionListener.class, ForeignKeyDisabling.class}) 可是运行时,却出现了异常: org.springframework.transaction.Trans

  DirtiesContextTestExecutionListener.class,

  CustomTransactionDbUnitTestExecutionListener.class,

  ForeignKeyDisabling.class})

  可是运行时,却出现了异常:

  org.springframework.transaction.TransactionSystemException: Could not roll back JPA transaction; nested exception is javax.persistence.PersistenceException: unexpected error when rollbacking

  at org.springframework.orm.jpa.JpaTransactionManager.doRollback(JpaTransactionManager.java:544)

  at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:846)

  at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:823)

  at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.endTransaction(TransactionalTestExecutionListener.java:588)

  at org.springframework.test.context.transaction.TransactionalTestExecutionListener.endTransaction(TransactionalTestExecutionListener.java:297)

  at org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:192)

  ……

  Caused by: javax.persistence.PersistenceException: unexpected error when rollbacking

  at org.hibernate.ejb.TransactionImpl.rollback(TransactionImpl.java:109)

  at org.springframework.orm.jpa.JpaTransactionManager.doRollback(JpaTransactionManager.java:540)

  ... 32 more

  Caused by: org.hibernate.TransactionException: rollback failed

  at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:215)

  at org.hibernate.ejb.TransactionImpl.rollback(TransactionImpl.java:106)

  ... 33 more

  Caused by: org.hibernate.TransactionException: unable to rollback against JDBC connection

  at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doRollback(JdbcTransaction.java:167)

  at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:209)

  ... 34 more

  Caused by: java.sql.SQLNonTransientConnectionException: connection exception: connection does not exist

  at org.hsqldb.jdbc.Util.sqlException(Unknown Source)

  at org.hsqldb.jdbc.Util.sqlException(Unknown Source)

  ……

  ... 35 more

  Caused by: org.hsqldb.HsqlException: connection exception: connection does not exist

  at org.hsqldb.error.Error.error(Unknown Source)

  at org.hsqldb.error.Error.error(Unknown Source)

  ... 40 more

  最后通过查看源代码发现,CustomDbUnitTestExecutionListener会先于TransactionalTestExecutionListener执行,而前者在执行完毕就关闭了数据库连接,后者在回滚时,就发生了连接不存在的异常。

  解决方法很简单,修改CustomTransactionalDbUnitTestExecutionListener:

  [java] view plaincopyprint?

  private static final Class[] CHAIN = {CustomDbUnitTestExecutionListener.class, TransactionalTestExecutionListener.class};

  private static final Class[] CHAIN = {CustomDbUnitTestExecutionListener.class, TransactionalTestExecutionListener.class};

  也就是数组两个元素调换下位置。

原文转自:http://blog.csdn.net/mydeman/article/details/9374621