0

我一直在处理 JUnit 测试的项目中使用 Spring 事务管理。我已经让它在我的 JUnit 测试中正常工作,但我无法让它在此之外工作。这是我的基本情况:

我有一个处理 DbUnit 初始化的类,类似于:

@TransactionConfiguration( defaultRollback = true )
@Transactional(propagation=Propagation.REQUIRED)
public class DbUnitManagerImpl implements DbUnitManager {

    @Override
    public void initializeDatabase(String location) {
        // Does work to create a dataset from the file at location

        // Calls a function within this class to execute the dbUnit initialization
        runSetUp()
    }

    public void runSetUp() {
       // Executes dbUnit call to initialize database
    }
}

我在两个不同的情况下使用这个类。我在运行 JUnit 测试来初始化数据时使用它,并且我还从网页的支持 Bean 调用这些函数。

JUnit 设置将正确回滚,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/context/applicationContext-rdCore.xml" })
@TransactionConfiguration( defaultRollback = true )
@Transactional(propagation=Propagation.REQUIRED)
public abstract class BaseDatabaseTest {

    @Autowired private DbUnitManager dbUnitManager;

    @Test
    public void runTest1() {
        dbUnitManager.initializeDatabase("D:\\test.xml");
    }
}

我的支持 bean 以类似的方式工作,但是它允许 DbUnitManagerImpl 执行所有事务。我已经调试了事务正在使用:

System.out.println(TransactionSynchronizationManager.isActualTransactionActive());

在这两种情况下,都显示 true 表示正在启动事务,但回滚仅发生在 JUnit 测试中。支持 bean 如下所示:

@Service
@SessionScoped
public class DbUnitInitializerBean {

    @Autowired private DbUnitManager manager;

    /**
     * Initializes the database using the files at <code>location</code>
     */
    public void initializeDatabase() {
        manager.initializeDatabase("D:\\test.xml);
    }
}

几点注意事项:上面提到的三个类显然被剥离了。它们还存在于三个不同的 java 项目中。支持 bean 驻留在具有以下应用程序上下文的 Web 项目中:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:cache="http://www.springframework.org/schema/cache" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
         http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

    <context:annotation-config />
    <cache:annotation-driven />
    <context:component-scan base-package="com.nph.rd.dbunit" />

    <import resource="classpath:/context/applicationContext-rdCore.xml"/>
</beans>

包含 DbUnitManagerImpl 类的测试项目的应用程序上下文如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:cache="http://www.springframework.org/schema/cache" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
         http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

    <context:annotation-config />
    <cache:annotation-driven />


    <import resource="classpath:/context/applicationContext-rdCore.xml"/>

</beans>

主应用程序上下文位于包含我的 JUnit 测试的项目中,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:cache="http://www.springframework.org/schema/cache" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
         http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">

    <context:annotation-config />
    <tx:annotation-driven />

    <context:component-scan base-package="com.nph.rd.dbunit" />
    <context:component-scan base-package="com.nph.dbunit" />

    <bean id="dbUnitManager" class="com.nph.dbunit.dao.impl.DbUnitManagerImpl">
    </bean>

    <!-- allows for ${} replacement in the spring xml configuration from the .properties file on the classpath -->
    <context:property-placeholder location="classpath:/properties/core-system.properties" ignore-unresolvable="true"/>

    <!-- Transaction Manager -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- OLTP data source -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${oltp.database.driverClassName}" />
        <property name="url" value="${oltp.database.url}" />
        <property name="username" value="${oltp.database.username}" />
        <property name="password" value="${oltp.database.password}" />
    </bean>

</beans>

基本的最终目标是让我的 DbUnitManager 类在从 Backing Bean 使用它时能够在异常基础上回滚,但无论在我的 JUnit 测试中使用它时,它都会回滚。目前,我将 DbUnitManager 类设置为始终回滚,因为我试图让事务回滚一般工作。在我让它工作之后,我将把它移到异常的基础上回滚。

4

1 回答 1

0

从您的 DbUnitManagerImpl 中删除以下内容

 @TransactionConfiguration( defaultRollback = true )

此注释仅与 Spring TestRunner 一起使用。默认情况下,Spring TestRunner 将回滚所有事务,因此您可以使用 @TransactionConfiguration 覆盖该行为。

如果您使用的是 Spring TransactionManager(您是),它将自动回滚未捕获的运行时异常。如果要回滚检查的异常,可以在 @Transactional 注释中指定它们或将它们转换为运行时异常。

 @Transactional(rollbackFor = SomeCheckedException.class)
 public void someMethod() {}
于 2012-08-20T20:06:21.923 回答