@Test后的回滚事务

2022-08-31 09:50:29

首先,我在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来实现这一点


答案 1

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

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

默认情况下,Spring将围绕您的测试方法和/回调启动一个新事务,并在结束时回滚。默认情况下,它的工作原理是,在上下文中有一些事务管理器就足够了。@Before@After

来自: 10.3.5.4 事务管理(粗体矿):

在TestContext框架中,事务由TranssagealTestExecutionListener管理。请注意,默认情况下会配置,即使您没有在测试类上显式声明也是如此。但是,要启用对事务的支持,必须在由语义加载的应用程序上下文中提供 Bean。此外,还必须在类或方法级别为测试声明@TransactionalTransactionalTestExecutionListener@TestExecutionListenersPlatformTransactionManager@ContextConfiguration


答案 2

题外话:试图修改Tomasz Nurkiewicz的答案被拒绝了:

这种编辑不会使帖子更容易阅读,更容易找到,更准确或更易于访问。更改要么是完全多余的,要么是严重损害可读性。


指向有关集成测试的文档相关部分的正确和永久链接

要启用对事务的支持,必须在 中配置通过语义加载的 Bean。PlatformTransactionManagerApplicationContext@ContextConfiguration

@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


推荐