@Before和@Transactional

2022-09-02 03:09:20

我有

@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration(defaultRollback = true, transactionManager = "transactionManager")

   @Before
   @Transactional
   public void mySetup() {
      // insert some records in db
   }

   @After
   @Transactional
   public void myTeardown() {
      // delete some records
   }

   @Test
   @Transactional
   public void testMy() {
      // do stuff
   }

我的问题是:mySetup,testMy和myTeardown是否都在同一笔交易中运行?看起来他们应该这样做,但我得到了一些奇怪的错误,这可能表明他们正在互相踩踏。


答案 1

是的,所有三种方法将在同一事务中运行。请参阅参考文档中的 TestContext Framework/Transaction Management 部分:

任何之前的方法(例如用JUnit的@Before注释的方法)和任何之后的方法(例如用JUnit的@After注释的方法)都在事务执行

因此,对 和 的注释是多余的,甚至可能被认为是误导性的,因为它们的事务性是由当前正在执行的单个测试方法决定的。@TransactionalmySetup()myTeardown()

这是因为 (负责启动/完成事务) 的 和 回调分别在 JUnit 的方法之前和 JUnit 的方法之后执行。beforeTestMethod()afterTestMethod()TransactionalTestExecutionListener@Before@After


答案 2

春季5发生了一些变化。根据文档

方法级生命周期方法(例如,使用 JUnit Jupiter 的@BeforeEach@AfterEach注释的方法)在测试管理的事务中运行。

另一方面,套件级和类级生命周期方法(例如,使用 JUnit Jupiter 的@BeforeAll@AfterAll注释的方法以及使用 TestNG 的@BeforeSuite、@AfterSuite@BeforeClass@AfterClass注释的方法)不在测试管理的事务中运行

如果需要在事务中的套件级或类级生命周期方法中执行代码,则可能希望将相应的 PlatformTransactionManager 注入到测试类中,然后将其与事务模板一起使用以进行编程式事务管理


推荐