@Before和@Transactional

我有

@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都会在同一个事务中运行吗? 看起来他们应该这样,但我得到了一些奇怪的错误,这可能表明他们互相踩着。

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

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

因此, mySetup()myTeardown()上的@Transactional注释有点多余,甚至可能被误导,因为它们的事务性由当前执行的单个测试方法决定。

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