gpt4 book ai didi

java - spring集成测试事务不回滚

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:25:53 26 4
gpt4 key购买 nike

为基于 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 将 session 对象插入到 Strategy 服务中。这个模拟对象只是抛出异常,在这个异常中,策略服务数据通过 DAO 层保存到数据库中。然后测试通过 DAO 层向数据库发出请求并断言保存的值。

数据是通过 Hibernate 持久化的,所以基本上在我的 DAO 对象中,对象就是这样保存的

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

sessionFactory 是 AnnotationSessionFactoryBean,其中数据源是 c3p0 ComboPooledDataSource 类

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

最佳答案

通常的问题是您的服务层调用其他层,这些层也被标记为 @Transactional,甚至可能带有 REQUIRES_NEW。在这种情况下,测试监听器只能访问外部事务,而无法回滚内部事务。

通常问题是DAO层上有@Transactional注解。如果有,请将其删除。 DAO层不应该有事务划分。

关于java - spring集成测试事务不回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5934393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com