私は、JUnitテストを扱うプロジェクトで春のトランザクション管理を使用しています。これは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
}
}
私はこのクラスを2つの異なるインスタンスで使用しています。JUnitテストを実行してデータを初期化するときに使用します。また、これらの関数をWebページのバッキング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);
}
}
いくつかの注意:上記の3つのクラスは明らかに削除されています。また、3つの異なる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クラスを常にロールバックするように設定しています。動作させたら、例外的にロールバックに移します。