Bra*_*rad 5 junit spring dbunit spring-transactions
简而言之
我的命令行Java应用程序将数据从一个数据源复制到另一个数据源而不使用XA.我已经配置了两个单独的数据源,并希望能够回滚两个数据源上的数据的JUnit测试.我使用DBUnit将数据加载到"源"数据库中,但我不能让它回滚.我可以让"目标"数据源回滚.
我的守则
鉴于此配置......
<tx:annotation-driven />
<!-- note the default transactionManager name on this one -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceA" />
</bean>
<bean id="transactionManagerTarget" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceB" />
</bean>
Run Code Online (Sandbox Code Playgroud)
这段代码......
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:resources/spring-context.xml",
"classpath:resources/spring-db.xml"})
@Transactional
@TransactionConfiguration(transactionManager = "transactionManagerTarget", defaultRollback = true)
public class MyIntegrationTest {
@Autowired
private MyService service;
@Autowired
@Qualifier("dataSourceA")
private DataSource dataSourceA;
private IDataSet loadedDataSet;
/**
* Required by DbUnit
*/
@Before
public void setUp() throws Exception {
SybaseInsertIdentityOperation.TRUNCATE_TABLE.execute(getConnection(), getDataSet());
SybaseInsertIdentityOperation.INSERT.execute(getConnection(), getDataSet());
}
/**
* Required by DbUnit
*/
protected IDataSet getDataSet() throws Exception {
loadedDataSet = DbUnitHelper.getDataSetFromFile(getConnection(), "TestData.xml");
return loadedDataSet;
}
/**
* Required by DbUnit
*/
protected IDatabaseConnection getConnection() throws Exception{
return new DatabaseConnection(dataSourceA.getConnection());
}
@Test
public void testSomething() {
// service.doCopyStuff();
}
}
Run Code Online (Sandbox Code Playgroud)
我看到的问题是,@TransactionConfiguration
只说明了启用回滚的目标数据源.DBUnit被dataSourceA
显式传递,并且正在拾取名为transactionManager
(我不确定如何)的默认事务管理器,该事务管理器尚未被告知要回滚.
题
如何告诉两个事务管理器回滚?
当我的数据源不支持XA事务时,我可以使用单个事务管理器吗?
注意:在生产中运行时,应用程序不需要dataSourceA上的事务管理器,因为它只是只读的.此问题仅适用于我的测试类.
一种可能的解决方法是引入一个注释为 的辅助 bean @Transactional("transactionManagerTarget")
,并让您的测试注释为@Transactional("transactionManager")
,并将两者配置为defaultRollback = true
。然后,您的测试必须调用辅助 bean,而辅助 bean 又将调用您的被测服务 bean。这应该会导致围绕您的服务的事务回滚,然后是围绕 DBUnit 的事务。
不过,有点乱。
其他可能的方法:
归档时间: |
|
查看次数: |
9271 次 |
最近记录: |