Spring Junit测试在事务后不回滚
我试图对一些持久性代码进行单元测试,但遇到了一个问题,即数据库挂起在前面的测试中创建的行。我也在使用Hibernate搜索,尽管我在这里分享的代码中没有反映这一点 我正在使用Spring3.1.x、Hibernate4.x和HSQLDB2.3.2 日志 代码 代码Spring Junit测试在事务后不回滚,spring,hibernate,junit,spring-transactions,Spring,Hibernate,Junit,Spring Transactions,我试图对一些持久性代码进行单元测试,但遇到了一个问题,即数据库挂起在前面的测试中创建的行。我也在使用Hibernate搜索,尽管我在这里分享的代码中没有反映这一点 我正在使用Spring3.1.x、Hibernate4.x和HSQLDB2.3.2 日志 代码 代码 公共类CoreTest扩展了TestCase{ @注入 受保护的SimpleManager simpleMgr; public void baseSetup(){ simpleMgr.flush(); simpleMgr.clear(
公共类CoreTest扩展了TestCase{
@注入
受保护的SimpleManager simpleMgr;
public void baseSetup(){
simpleMgr.flush();
simpleMgr.clear();
//在第一次测试之后,它包含所有创建的用户角色
List roles=simpleMgr.getAll(UserRole.class);
UserRole=新的UserRole(UserRole.role\u匿名);
simpleMgr.save(角色);
角色=新用户角色(UserRole.role\u USER);
simpleMgr.save(角色);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@上下文配置(位置={
“类路径:/spring/applicationContext.xml”
“classpath:/spring/applicationContext transaction.xml”})
公共类MyManagerTest扩展了CoreTest{
@以前
公共void方法设置(){
super.baseSetup();
角色=新用户角色(UserRole.role\u PROUSER);
simpleMgr.save(角色);
simpleMgr.save(userMgr.createUser(“marc”marc@gmail.com"));
simpleMgr.flush();
}
@试验
@交易的
公共void test1(){
...
}
@试验
@交易的
公共无效测试2(){
....
}
事务管理
<bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
<property name="targetDataSource" ref="mainDataSource"/>
</bean>
<bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driverClassName}"/>
[...]
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
<property name="hibernateProperties">
<value>
hibernate.connection.driver_class=${jdbc.driverClassName}
hibernate.jdbc.batch_size=30
hibernate.dialect=${hibernate.dialect}
hibernate.connection.autoReconnect=true
hibernate.connection.autoReconnectForPools=true
hibernate.connection.autocommit=false
</value>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
[...]
hibernate.connection.driver_class=${jdbc.drivercassname}
hibernate.jdbc.batch_size=30
hibernate.dialogue=${hibernate.dialogue}
hibernate.connection.autoReconnect=true
hibernate.connection.autoReconnectForPools=true
hibernate.connection.autocommit=false
尝试在测试类上添加@Transactional注释。尝试添加事务拦截器:
<beans xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
...
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
扩展AbstractTransactionalJunit4SpringContextTests或添加@TestExecutionListeners(TransactionalTestExecutionListener.class).因此,我最终通过在BoneCPDatasource上指定defaultAutoCommit=false实现了这一点。看来这对于此配置来说级别太低了,因此可能是错误的。但至少它可以工作。是的,这无助于尝试添加@Rollback(true)
对您的测试进行注释。谢谢。可能是因为您没有清理数据,所以没有什么不同吗?我还尝试使用rollback=true显式指定transactionmanagement。没有帮助,这是Spring设置的默认值。日志表明回滚实际上正在发生,只是似乎没有传播到数据库中你的意思是清理?回滚表明不需要显式清理?就是这样,我没有在示例中包括这个。不确定这是否会有帮助,因为它只是一个方便的类,用于处理上下文中的内容。我过去经常遇到问题,因为缺少@TestExecutionListeners(TransactionalTestExecutionListener.class)。顺便说一下,您扩展了TestCase—您使用的是哪个版本的junit?(不需要扩展Junit4中的任何内容)。
public class CoreTest extends TestCase {
@Inject
protected SimpleManager<Long> simpleMgr;
public void baseSetup(){
simpleMgr.flush();
simpleMgr.clear();
//after 1st test this contains all created UserRoles
List roles = simpleMgr.getAll(UserRole.class);
UserRole role = new UserRole(UserRole.ROLE_ANONYMOUS);
simpleMgr.save(role);
role = new UserRole(UserRole.ROLE_USER);
simpleMgr.save(role);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"classpath:/spring/applicationContext.xml"
"classpath:/spring/applicationContext-transaction.xml"})
public class MyManagerTest extends CoreTest{
@Before
public void methodSetup(){
super.baseSetup();
role = new UserRole(UserRole.ROLE_PROUSER);
simpleMgr.save(role);
simpleMgr.save(userMgr.createUser("marc", "marc@gmail.com"));
simpleMgr.flush();
}
@Test
@Transactional
public void test1(){
...
}
@Test
@Transactional
public void test2(){
....
}
<bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
<property name="targetDataSource" ref="mainDataSource"/>
</bean>
<bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driverClassName}"/>
[...]
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
<property name="hibernateProperties">
<value>
hibernate.connection.driver_class=${jdbc.driverClassName}
hibernate.jdbc.batch_size=30
hibernate.dialect=${hibernate.dialect}
hibernate.connection.autoReconnect=true
hibernate.connection.autoReconnectForPools=true
hibernate.connection.autocommit=false
</value>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<beans xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
...
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>