public abstract class SqlMapTestCase extends DatabaseTestCase {
protected SqlMapClient sqlMapClient = null;
protected Properties props = new Properties();
protected IDatabaseConnection getConnection() throws Exception {
props.load(Resources.getResourceAsStream("properties/database.properties"));
Class.forName(props.getProperty("driver"));
Connection conn = DriverManager.getConnection(props.getProperty("url"),
props.getProperty("username"), props.getProperty("password"));
return new DatabaseConnection(conn);
}
protected IDataSet getDataSet() throws Exception {
String resource = "com/codemany/netlink/dao/impl/dataset.xml";
return new FlatXmlDataSet(Resources.getResourceAsStream(resource));
}
protected void setUp() throws Exception {
super.setUp();
// Build the SqlMapClient
Reader reader = Resources.getResourceAsReader("sql-map-config.xml");
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
// Tell the SqlMapClient to use the given DataSource
DataSource dataSource = getDataSource();
TransactionConfig transactionConfig = getTransactionConfig(dataSource);
// Apply the given TransactionConfig to the SqlMapClient
applyTransactionConfig(sqlMapClient, transactionConfig);
}
protected void tearDown() throws Exception {
super.tearDown();
if (sqlMapClient != null) {
DataSource ds = sqlMapClient.getDataSource();
Connection conn = ds.getConnection();
conn.close();
}
}
private DataSource getDataSource() throws Exception {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(props.getProperty("driver"));
dataSource.setUrl(props.getProperty("url"));
dataSource.setUsername(props.getProperty("username"));
dataSource.setPassword(props.getProperty("password"));
return dataSource;
}
private TransactionConfig getTransactionConfig(DataSource dataSource) throws Exception {
Properties transactionConfigProperties = new Properties();
transactionConfigProperties.setProperty("SetAutoCommitAllowed", "false");
TransactionConfig transactionConfig = (TransactionConfig)ExternalTransactionConfig.class.newInstance();
transactionConfig.setDataSource(dataSource);
transactionConfig.initialize(transactionConfigProperties);
return transactionConfig;
}
private void applyTransactionConfig(SqlMapClient sqlMapClient, TransactionConfig transactionConfig) {
if (!(sqlMapClient instanceof ExtendedSqlMapClient)) {
throw new IllegalArgumentException("Cannot set TransactionConfig with DataSource"
+ "for SqlMapClient if not of type ExtendedSqlMapClient: " + sqlMapClient);
}
ExtendedSqlMapClient extendedClient = (ExtendedSqlMapClient)sqlMapClient;
transactionConfig.setMaximumConcurrentTransactions(extendedClient.getDelegate().getMaxTransactions());
extendedClient.getDelegate().setTxManager(new TransactionManager(transactionConfig));
}
}
然后为每个SqlMap映射文件编写一个测试类,继承上面的抽象类:
12345678
public class UserSqlMapTest extends SqlMapTestCase {
public void testGetUser() throws Exception {
User user = (User)sqlMapClient.queryForObject("getUser", "ford");
assertNotNull(user);
assertEquals("ford", user.getName());
}
}