我有集成测试,该测试测试了一些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