spring @Test后回滚事务

qlfbtfca  于 2023-08-02  发布在  Spring
关注(0)|答案(8)|浏览(155)

首先,我在StackOverflow上找到了很多关于这个问题的帖子,但没有一个真正帮助我,所以很抱歉问可能重复的问题。
我正在使用spring-test运行JUnit测试,我的代码如下所示

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = {})
public class StudentSystemTest {

    @Autowired
    private StudentSystem studentSystem;

    @Before
    public void initTest() {
    // set up the database, create basic structure for testing
    }

    @Test
    public void test1() {
    }    
    ...  
}

字符串
我的问题是我希望我的测试不影响其他测试。所以我想为每个测试创建一些类似回滚的东西。我找了很多,但到目前为止什么也没找到。我使用Hibernate和MySql

xmd2e60i

xmd2e60i1#

只需在测试的顶部添加@Transactional注解:

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = {"testContext.xml"})
@Transactional
public class StudentSystemTest {

字符串
默认情况下,Spring将围绕测试方法和@Before/@After回调启动一个新事务,并在最后回滚。它默认工作,在上下文中有一些事务管理器就足够了。
来自:*10.3.5.4事务管理 *(粗体):
在TestContext框架中,事务由TransactionalTestExecutionListener管理。请注意,TransactionalTestExecutionListener默认配置的,即使您没有在测试类上显式声明@TestExecutionListeners。但是,要启用对事务的支持,必须在由@ContextConfiguration语义加载的应用程序上下文中提供PlatformTransactionManagerbean。此外,您必须在测试的类或方法级别声明@Transactional

cigdeys3

cigdeys32#

  • 旁白:* 试图修改Tomasz Nurkiewicz的回答被拒绝:

这种编辑并没有使帖子更容易阅读,更容易找到,更准确或更容易访问。更改要么是完全多余的,要么会严重损害可读性。
集成测试文档相关部分的正确永久链接。
要启用对事务的支持,必须在通过@ContextConfiguration语义加载的ApplicationContext中配置PlatformTransactionManager bean。

@Configuration
@PropertySource("application.properties")
public class Persistence {
    @Autowired
    Environment env;

    @Bean
    DataSource dataSource() {
        return new DriverManagerDataSource(
                env.getProperty("datasource.url"),
                env.getProperty("datasource.user"),
                env.getProperty("datasource.password")
        );
    }

    @Bean
    PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }
}

字符串
此外,您必须在测试的类或方法级别声明Spring的@Transactional注解。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Persistence.class, SomeRepository.class})
@Transactional
public class SomeRepositoryTest { ... }


使用@Transactional注解测试方法会导致测试在事务中运行,默认情况下,该事务将在测试完成后自动回滚。如果一个测试类用@Transactional注解,那么这个类层次结构中的每个测试方法都将在一个事务中运行。

83qze16e

83qze16e3#

提到添加@Transactional的答案是正确的,但为了简单起见,您可以只使用测试类extends AbstractTransactionalJUnit4SpringContextTests

3zwjbxry

3zwjbxry4#

我知道,我太晚了,不能给出答案,但希望它能帮助到别人。另外,我刚刚解决了我的测试问题。这是我在测试中得到的:
我的测试班

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "path-to-context" })
@Transactional
public class MyIntegrationTest

字符串
上下文XML

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
   <property name="driverClassName" value="${jdbc.driverClassName}" />
   <property name="url" value="${jdbc.url}" />
   <property name="username" value="${jdbc.username}" />
   <property name="password" value="${jdbc.password}" />
</bean>


我仍然有问题,数据库没有被自动清理。
当我将以下属性添加到BasicDataSource时,问题得到解决

<property name="defaultAutoCommit" value="false" />


希望对你有帮助。

epfja78i

epfja78i5#

除了在@Test方法上添加@Transactional外,还需要添加@Rollback(false)

ffx8fchx

ffx8fchx6#

您需要使用Spring上下文和事务管理器运行测试,例如,

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = {"/your-applicationContext.xml"})
@TransactionConfiguration(transactionManager="txMgr")
public class StudentSystemTest {

     @Test
     public void testTransactionalService() {
         // test transactional service
     }

     @Test
     @Transactional
     public void testNonTransactionalService() {
         // test non-transactional service
     }
}

字符串
有关更多详细信息,请参见Spring参考的第3.5.8. Transaction Management章。

aiqt4smr

aiqt4smr7#

正如上面最受欢迎的答案所回答的那样,基本上你只需要做下面的两件事就可以在测试用例中回滚事务:

  • 在测试类上添加@Transactional
  • 在测试用例上添加**@Rollback**

如果它仍然不起作用,请仔细检查您的系统是否使用多个数据源,如果是这样,您还需要根据SQL将连接到哪个数据库来指定事务的预期数据源。
代码示例:

@SpringBootTest(classes = Sample.class)
@Transactional(transactionManager = "txManagerXX") // specify txManager here if your system uses multiple sources
public class SampleTest {

    @Test
    @Rollback
    public void test_case_1(){
        ...
    }

}

字符串

djmepvbi

djmepvbi8#

您可以禁用回滚:

@TransactionConfiguration(defaultRollback = false)

字符串
示例如下:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@Transactional
@TransactionConfiguration(defaultRollback = false)
public class Test {
    @PersistenceContext
    private EntityManager em;

    @org.junit.Test
    public void menge() {
        PersistentObject object = new PersistentObject();
        em.persist(object);
        em.flush();
    }
}

相关问题