【发布时间】:2019-02-24 13:22:48
【问题描述】:
我们使用的是 Spring Boot 2,在我们的集成测试中,我们需要在事务中手动执行一些代码,并且在事务结束和断言之后,我们希望回滚该事务。
我们使用显式定义的事务而不是 @Transactional,因为有时我们需要在测试 2 事务中执行。
这是测试样本:
@Test
public void fooTest() {
// transaction 1
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
// some code in transaction
}
// transaction 2
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
// some code in transaction
}
// here I need rollback these transactions for clean db for another tests
}
你能告诉我如何在我们的案例中使用回滚来回滚两个事务吗?这是我们维护的旧代码,所以如果可以在引导 2 中做得更好,我将不胜感激任何建议。我们只需在一个测试中执行 2 个事务。
【问题讨论】:
-
请检查 Spring Testing 中的 Programmatic Transaction Management 是否适用于您的情况:docs.spring.io/spring/docs/current/spring-framework-reference/… 和 baeldung.com/spring-test-programmatic-transactions
-
“在一个测试中执行两个事务”与“回滚两个事务”不同-您需要执行后者还是前者?如果是后者,只需通过调用 status.setRollbackOnly(true) 来结束回调 - 或抛出一些运行时异常 - 这将使模板回滚事务......(并将对 execute() 的调用包装在 try/捕获块,以便它们都运行:-))。
-
嗯 - 但你需要检查你的回调中的断言......
标签: spring spring-boot transactions integration-testing spring-transactions