在@Test之后回滚事务

首先,我在StackOverflow上发现了很多关于这个的线程,但是他们没有一个真的帮助我,所以很抱歉要问可能重复的问题。

我使用spring-test运行JUnittesting,我的代码看起来像这样

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

我的问题是,我想我的testing不影响其他testing。 所以我想为每个testing创build一些回滚。 我为此搜寻了很多,但到目前为止我还没有发现任何东西。 我为此使用Hibernate和MySql

只需在testing之上添加@Transactional注释:

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

默认情况下,Spring将启动围绕您的testing方法的新事务和@Before / @Aftercallback,最后回滚。 它默认工作,在上下文中有足够的事务pipe理器。

来自: 10.3.5.4事务pipe理 (粗体):

在TestContext框架中,事务由TransactionalTestExecutionListenerpipe理。 请注意, TransactionalTestExecutionListener默认configuration的 ,即使您没有在testing类中显式声明@TestExecutionListeners 。 但是,为了支持事务,必须在由@ContextConfiguration语义加载的应用程序上下文中提供一个PlatformTransactionManager bean。 另外, 您必须在类或方法级别为testing声明@Transactional

旁白试图修改托马斯·努尔凯维奇的答案被拒绝了:

这种编辑不会使文章更容易阅读,更容易find,更准确或更易于阅读。 更改要么完全是多余的,要么主动损害可读性。


正确和永久地链接到集成testing的相关文档部分。

要启用对事务的支持,您必须在通过@ContextConfiguration语义加载的ApplicationContext中configuration一个PlatformTransactionManager bean。

 @组态
 @PropertySource( “application.properties”)
公共类持久{
     @Autowired
    环境环境

     @豆
     DataSource的dataSource(){
        返回新的DriverManagerDataSource(
                 env.getProperty( “datasource.url”),
                 env.getProperty( “datasource.user”),
                 env.getProperty( “datasource.password”)
         );
     }

     @豆
     PlatformTransactionManager transactionManager(){
        返回新的DataSourceTransactionManager(dataSource());
     }
 }

另外,您必须在类或方法级别为testing声明Spring的@Transactional注释。

 @RunWith(SpringJUnit4ClassRunner.class)来
 @ContextConfiguration(classes = {Persistence.class,SomeRepository.class})
 @Transactional
公共类SomeRepositoryTest {...}

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

提到添加@Transactional的答案是正确的,但为了简单起见,您可以让testing类extends AbstractTransactionalJUnit4SpringContextTests

我知道,我太迟了,不能发表一个答案,但希望这可能有助于某人。 另外,我刚刚解决了我的testing问题。 这是我在testing中的:

我的testingclass

 @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" /> 

希望能帮助到你。

您需要使用sprint环境和事务pipe理器来运行testing,例如,

 @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 } } 

有关更多详细信息,请参阅第10. Testing章Spring 10. Testing

您可以禁用回滚:

 @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(); } }