事务是否从TransactionalTestExecutionListener传播到TestRestTemplate?

时间:2019-10-01 16:38:41

标签: spring-boot spring-boot-test

我有集成测试,该测试测试了一些rest控制器,但是在执行完数据库后,修改了db,并且在测试结束时不回滚其中的数据,我必须使用@DirtiesContext重新初始化。我不确定是否真的需要(肯定如此),以及我的配置有误。

我的集成测试的注释为:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Transactional

和各个测试方法如下:

@Test
//@DirtiesContext    
public void testPostWhatever() {

此测试仅创建一些请求数据,然后调用post,这将把数据持久保存到DB中。然后我们使用GET请求来查找是否可以找到这些数据。不重要的。根据javadoc,默认情况下,此测试应该是事务性的,并且应该回滚为测试而打开的事务。启用休眠日志记录后,我可以看到,TX是为测试方法创建的:

2019-10-01 18:01:59.094 o.s.orm.jpa.JpaTransactionManager        : Creating new transaction with name [somePackage.TestClass.testMethod]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT

我看到Controller被调用,我看到它的TX已创建,并且tx被重用了

2019-10-01 18:01:59.663 o.s.orm.jpa.JpaTransactionManager        : Creating new transaction with name [somePackage.SomeService.someMethod]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT

2019-10-01 18:01:59.674 o.s.orm.jpa.JpaTransactionManager        : Participating in existing transaction

然后我可以看到提交被称为:

2019-10-01 18:02:00.286 o.s.orm.jpa.JpaTransactionManager        : Committing JPA transaction on EntityManager [SessionImpl(341270043<open>)]
2019-10-01 18:02:00.286 o.h.e.t.internal.TransactionImpl         : committing

,然后回滚:

2019-10-01 18:02:00.304 o.s.orm.jpa.JpaTransactionManager        : Rolling back JPA transaction on EntityManager [SessionImpl(1723900181<open>)]
2019-10-01 18:02:00.304 o.h.e.t.internal.TransactionImpl         : rolling back
2019-10-01 18:02:00.305 o.s.orm.jpa.JpaTransactionManager        : Closing JPA EntityManager [SessionImpl(1723900181<open>)] after transaction

现在我不知道测试应该如何进行。 Tx在测试中打开,测试和服务方法确实具有必需的tx传播,并且日志表明,测试TX已重新用于控制器(否则我将不了解参与其中的tx服务)。另一方面,测试方法的最终回滚不会因服务而保留回滚更改,并且插入的记录“幸存”并且存在于另一个测试中。

问题:TX是否从TransactionalTestExecutionListener传播到通过TestRestTemplate调用的剩余控制器中? A)如果传播了,我在做什么错,这样数据就不会回滚? B)如果不传播,使用@DirtiesContext是否正确? (实际上,由于测试时间的影响和其他一些问题,我想避免这种情况。)

springboot版本:2.1.8.RELEASE

0 个答案:

没有答案