Spring集成测试事务不会回滚

时间:2011-05-09 08:26:36

标签: java spring transactions integration-testing junit4

基于Spring的应用程序编写集成测试遇到了事务回滚的问题 - 插入了数据,但是在事务回滚后,数据仍在数据库表中... Spring 3.0.5,JUnit 4.8.2

集成测试代码

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/applicationContext.xml" })
@TransactionConfiguration(transactionManager="txManager",defaultRollback=true)
@Transactional
public class GenerateCodeStrategyTest {

  @Autowired
  @Qualifier(value = "generateCodeStrategy")
  private Strategy generateCodeStrategy;

  @Test
  @Transactional
  public void genCodeIntegrationTestCommunicationFailure() {
  //generate some parameters
  SMPPSession mockedSession = mock(SMPPSession.class);
  generateCodeStrategy.setSession(mockedSession);
  generateCodeStrategy.sendRequest(params);
  final SubscribeInfo subscribeInfo = subscribeDao.getUserByPhone(phone);
  assertNotNull(subscribeInfo);
  assertEquals(phone, subscribeInfo.getPhone());
  assertEquals(Status.BAD_STATUS, subscribeInfo.getStatus());
  }
}

在日志中的DEBUG模式下,我可以看到事务已启动并回滚

INFO: Began transaction (1): transaction manager [org.springframework.jdbc.datasource.DataSourceTransactionManager@1edd9b3]; rollback [true]
[main] DEBUG org.hibernate.SQL - insert into sms_subscribe (phone_cell, status, ts_subscribe, subscription_status, ts_unsubscribe, receiverIdentification, user_id) values (?, ?, ?, ?, ?, ?, ?) 
INFO: Rolled back transaction after test execution for test context [[TestContext@1f18cbe testClass = GenerateCodeStrategyTest, locations = array<String>['classpath:/applicationContext.xml'], testInstance = lv.mrb.server.service.GenerateCodeStrategyTest@14f1726, testMethod = genCodeIntegrationTestCommunicationFailure@GenerateCodeStrategyTest, testException = [null]]]

也许有人知道为什么会这样?谢谢你的帮助。

更新: 此集成测试生成一些参数,然后使用Mockito mock将会话对象插入到Strategy服务中。这个模拟对象只是抛出异常并且在此异常中,策略服务数据通过DAO层保存到数据库。然后通过DAO层测试对数据库的请求并断言保存的值。

数据通过Hibernate持久存储,因此基本上在我的DAO对象对象中保存了这种方式

final Session currentSession = sessionFactory.getCurrentSession();
currentSession.save(object);

sessionFactory是AnnotationSessionFactoryBean,其中datasource是c3p0 ComboPooledDataSource类

更新2:问题出在Mysql引擎上,默认情况下是MyISAM,所以我只需要将它切换到InnoDB,现在一切正常。

2 个答案:

答案 0 :(得分:4)

通常的问题是,您的服务层会调用其他图层,这些图层也会标记为@Transactional,甚至可能会调用REQUIRES_NEW。在这种情况下,Test侦听器只能访问外部事务,但无法回滚内部事务。

问题通常是DAO层上有@Transactional个注释。如果有,请删除它们。 DAO层上不应该有事务划分。

答案 1 :(得分:0)

尝试从类级别删除@Transactional注释,并仅将其留给特定的测试方法。

希望它有所帮助。