Java @Before和@Transactional
我有Java @Before和@Transactional,java,spring,unit-testing,junit,Java,Spring,Unit Testing,Junit,我有 我的问题是:mySetup、testMy和myTeardown是否都在同一事务中运行?看起来他们应该这样做,但我发现了一些奇怪的错误,这可能表明他们是在互相踩着。是的,这三种方法都将在同一个事务中运行。参见参考文件中的章节: 在事务中执行任何before方法(例如用JUnit的@before注释的方法)和任何after方法(例如用JUnit的@after注释的方法) 因此,mySetup()和myTeardown()上的@Transactional注释有点多余,甚至可能被认为是误导性的,因
我的问题是:mySetup、testMy和myTeardown是否都在同一事务中运行?看起来他们应该这样做,但我发现了一些奇怪的错误,这可能表明他们是在互相踩着。是的,这三种方法都将在同一个事务中运行。参见参考文件中的章节: 在事务中执行任何before方法(例如用JUnit的@before注释的方法)和任何after方法(例如用JUnit的@after注释的方法) 因此,
mySetup()
和myTeardown()
上的@Transactional
注释有点多余,甚至可能被认为是误导性的,因为它们的事务性是由当前执行的单个测试方法决定的
这是因为
TransactionalTestExecutionListener
(负责启动/完成事务)的beforeTestMethod()
和beforeTestMethod()
回调是在JUnit的@before
方法之前和JUnit的@after
方法之后执行的,分别。如果用@Transactional注释@Before和@After方法,它们将不会在事务中运行。但是,如果您将@Transactional用于您的测试方法(对其具有@test的方法)或整个测试类,则每个测试方法都将在不同的事务中运行,@Before和@After方法也将在与每个@test方法相同的事务中运行。有关更多说明,请参见以下两个代码段:
@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
}
上述代码的运行方式与以下代码完全相同:
@Transactional
public class MyTestClass {
@Before
public void beforeTest() {
...
}
@Test
void testMethod1() {
...
}
@Test
void testMethod2() {
...
}
@After
public void afterTest() {
...
}
}
在每个“testMethod1”和“testMethod2”方法的这两个代码段中,都会有不同的事务。而且“beforethod”和“afterMethod”方法将分别在每个测试方法的事务中运行。在Spring 5中发生了一些变化。 根据: 方法级生命周期方法-例如,使用JUnit Jupiter的@beforeach或@AfterEach注释的方法-在测试管理事务中运行 另一方面,套件级和类级生命周期方法-例如, JUnit Jupiter的@BeforeAll或@aftereall注释的方法和TestNG的@BeforeSuite、@AfterSuite、@BeforeClass注释的方法不在测试管理事务中运行 如果您需要在事务中的套件级或类级生命周期方法中执行代码,您可能希望将相应的平台TransactionManagerr注入测试类,然后将其与用于编程事务管理的TransactionTemplate一起使用
public class MyTestClass {
@Before
public void beforeTest() {
...
}
@Test
@Transactional
void testMethod1() {
...
}
@Test
@Transactional
void testMethod2() {
...
}
@After
public void afterTest() {
...
}
}