代码之家  ›  专栏  ›  技术社区  ›  Synesso

Spring JDBC测试的事务回滚

  •  12
  • Synesso  · 技术社区  · 15 年前

    在使用Spring测试时,我试图让JDBC事务回滚,但没有成功。当我运行以下命令时,SQL更新总是提交的。

    package my.dao.impl;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.annotation.Rollback;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.TestExecutionListeners;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
    import org.springframework.test.context.transaction.TransactionConfiguration;
    
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.Statement;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
    @ContextConfiguration(locations={"classpath:ApplicationContext-test-DAOs.xml"})
    @TransactionConfiguration(defaultRollback = true)
    public class ConfirmationMatchingDAOImplTest {
    
        @Autowired
        private DataSource dataSource;
    
        @Test
        public void shouldInsertSomething() throws Exception {
            final Connection connection = dataSource.getConnection();
            final Statement statement = connection.createStatement();
            statement.executeUpdate("insert into TEST_INSERT values (1, 'hello')");
            statement.close();
            connection.close();
        }
    }
    

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
        <property name="url" value="jdbc:sqlserver://makeitfunky:1490;databaseName=fonzie"/>
        <property name="username" value="ralph"/>
        <property name="password" value="p0n1es_R_kew1"/>
    </bean>
    

    另外,我是否使用了太多注释?我能把它弄干净一点吗?

    7 回复  |  直到 15 年前
        1
  •  18
  •   Chin Huang    15 年前

    如果未使用 @TestExecutionListeners 注释,默认情况下Spring配置 DependencyInjectionTestExecutionListener , DirtiesContextTestExecutionListener ,和 TransactionalTestExecutionListener 事务性测试执行监听器 提供具有默认回滚语义的事务性测试执行。通过显式声明 @测试执行监听器 在你的测试课上 事务性测试执行监听器 从侦听器列表中,您将禁用事务性支持。

    @Transactional 类或方法级别的注释。

    DataSourceUtils 获取由DataSourceTransactionManager管理的事务连接。

        2
  •  2
  •   msduk    12 年前

    如果您使用的是非xml方法,那么这个方法自3.1版以来运行良好

    @Transactional
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = {TestDbConfig.class, SomeService.class})
    public class SomeTest {
    
    @Inject
    private SomeService someService;
    
    @PersistenceContext
    private EntityManager em;
    
    @Test
    public void someTest() {}
    

    @Configuration
    @PropertySource(value = "classpath:app.properties")
    @EnableTransactionManagement
    @TransactionConfiguration(defaultRollback = true)
    public class TestDbConfig {
    
    //read the parameters from properties
    @Value("${hibernate.dialect:unset}")
    private String hibernateDialect;
    
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
    
    @Bean
    public PlatformTransactionManager transactionManager() {
        //for example
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());
        return transactionManager;
    }
    
    @Bean
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
        //set the datasource
        //set the JpaVendorAdapter
        //set the packagesToScan
        return some sort of LocalContainerEntityManagerFactoryBean;
    }
    
    @Bean
    DataSource dataSource() {
        return dataSource from jndi or a DriverManagerDataSource();
    }
    

    }

        3
  •  2
  •   grep    11 年前

     @TransactionConfiguration(defaultRollback=false)
    

    我的注释如下:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = { "/../applicationContext.xml" })
    @TransactionConfiguration(defaultRollback=true)
    public class DBCreatorTest {
    
        4
  •  1
  •   Raghuram    15 年前

    @Transactional 测试方法?

        5
  •  0
  •   JMax Dan    14 年前

    @事务性 注释在Spring中,必须将以下行添加到Spring配置文件中:

    <tx:annotation-driven transaction-manager="transactionManager"/>
    

    Source on IBM website

        6
  •  0
  •   herau Mate Å imović    12 年前

    其他信息:

    对于这条线

    <tx:annotation-driven transaction-manager="transactionManager"/>
    

    的默认值 transaction-manager 属性是“transactionManager”。 仅当transactionManager的bean id/名称不是“transactionManager”时,此属性才是必需的。 所以你只要设定:

    <tx:annotation-driven />
    
        7
  •  0
  •   user3145373 ツ    12 年前

    你需要添加 @Transactional 像这样的:

    @TransactionConfiguration(transactionManager = "txManager",defaultRollback = true)
    @Transactional
    

    txManager 是来自的事务管理器的实例或bean id application context

    <!-- Transaction Manager -->
        <bean id="txManager"
              class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
        </bean>
    
        <tx:annotation-driven transaction-manager="txManager" />
    
        8
  •  0
  •   codester    7 年前

    在尝试了很多以上的组合之后,下面的设置在测试成功后对我起到了完全回滚的作用。

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath:datasource-context-test.xml"})
    @TransactionConfiguration(defaultRollback = true)
    @Transactional
    public class DataAccessTest 
    {
    
    
        @Test
        public void testSaveRecords()
        { ... }
    }