Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @Before和@Transactional_Java_Spring_Unit Testing_Junit - Fatal编程技术网

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() {
        ...
    }
}