我有
@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 /事务管理部分:
在 事务 内 执行任何before方法(例如,用JUnit的@Before注释的方法)和任何after方法(例如,用JUnit的@After注释的方法)
因此@Transactional,mySetup()和上的注释myTeardown()是多余的,甚至可能被误导,因为它们的事务性由当前正在执行的单个测试方法确定。
@Transactional
mySetup()
myTeardown()
这是因为(负责启动/完成事务的)beforeTestMethod()和的afterTestMethod()回调分别在JUnit的方法TransactionalTestExecutionListener之前@Before和JUnit的@After方法之后执行。
beforeTestMethod()
afterTestMethod()
TransactionalTestExecutionListener
@Before
@After