那就只能先找到拋出這個異常的位置,然后向前推,逐步找到獲取連接的地方。最后發現,連接是在DbUnitTestExecutionListener.prepareDatabaseConnection中獲取連接,并且沒有做什么進一步的處理,所以前面的設置都不起作用??磥碛种荒芡ㄟ^重寫源代碼來達成目的了。
直接上源碼吧:
CustomTransactionDbUnitTestExecutionListener類: 完全復制DbUnitTestExecutionListener,只是增加一句代碼。注意該類的包路徑和DbUnitTestExecutionListener一致。
[java] view plaincopyprint?
private void prepareDatabaseConnection(TestContext testContext, String databaseConnectionBeanName) throws Exception {
Object databaseConnection = testContext.getApplicationContext().getBean(databaseConnectionBeanName);
if (databaseConnection instanceof DataSource) {
databaseConnection = DatabaseDataSourceConnectionFactoryBean.newConnection((DataSource) databaseConnection);
}
Assert.isInstanceOf(IDatabaseConnection.class, databaseConnection);
((IDatabaseConnection)databaseConnection).getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory());
testContext.setAttribute(CONNECTION_ATTRIBUTE, databaseConnection);
}
private void prepareDatabaseConnection(TestContext testContext, String databaseConnectionBeanName) throws Exception {
Object databaseConnection = testContext.getApplicationContext().getBean(databaseConnectionBeanName);
if (databaseConnection instanceof DataSource) {
databaseConnection = DatabaseDataSourceConnectionFactoryBean.newConnection((DataSource) databaseConnection);
}
Assert.isInstanceOf(IDatabaseConnection.class, databaseConnection);
((IDatabaseConnection)databaseConnection).getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory());
testContext.setAttribute(CONNECTION_ATTRIBUTE, databaseConnection);
}
綠色就是真正發揮作用的代碼。
可是這個類并不能直接飲用,而是通過TransactionDbUnitTestExecutionListener的CHAIN被調用的,而TransactionDbUnitTestExecutionListener同樣無法更改,同樣只能建一個自定義的TransactionDbUnitTestExecutionListener類,CustomTransactionDbUnitTestExecutionListener:
[java] view plaincopyprint?
public class CustomTransactionDbUnitTestExecutionListener extends TestExecutionListenerChain {
private static final Class[] CHAIN = { TransactionalTestExecutionListener.class,
CustomDbUnitTestExecutionListener.class };
@Override
protected Class[] getChain() {
return CHAIN;
}
}
public class CustomTransactionDbUnitTestExecutionListener extends TestExecutionListenerChain {
private static final Class[] CHAIN = { TransactionalTestExecutionListener.class,
CustomDbUnitTestExecutionListener.class };
@Override
protected Class[] getChain() {
return CHAIN;
}
}
那么測試類的注解也要修改:
[java] view plaincopyprint?
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-test.xml")
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
CustomTransactionDbUnitTestExecutionListener.class,
ForeignKeyDisabling.class})
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-test.xml")
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
CustomTransactionDbUnitTestExecutionListener.class,
ForeignKeyDisabling.class})
四、@Transactional標簽引起的問題
按照spring-dbunit-test的文檔中說法,可以使用@Transactional確保數據的清潔。使用簡單,只需要將上面的注解增加一個@Transactional,
[java] view plaincopyprint?
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-test.xml")
@Transactional
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
CustomTransactionDbUnitTestExecutionListener.class,
ForeignKeyDisabling.class})
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-test.xml")
@Transactional
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
原文轉自:http://blog.csdn.net/mydeman/article/details/9374621