DBunit Test
From JCFWiKi
목차 |
[편집] DBunit 기반 DAO 단위테스트
[편집] DBunit 아키텍처
- DBunit 핵심 구성요소
DBunit은 IDatabaseConnection의 getConnection()을 통해 대상 데이터베이스에 접속하여 connection을 얻고, IDataSet의 getDataSet()을 통해 XML, EXCEL, Stream 등의 다양한 데이터 소스로부터 데이터베이스 테이블의
1. IDatabaseConnection: 대상 데이터베이스에 대한 DBunit Connection을 나타내는 인터페이스 2. IDataSet: 데이터베이스 테이블의 집합을 나타내는 인터페이스 3. DatabaseOperation: 테스트 수행 전과 후에 수행되는 operation을 나타내는 abstract 클래스
[편집] DBnuit 기반 Dao 단위테스트
IDataSet
DBunit을 사용하여 테스트 데이터를 생성하고 제공하는 방법은 크게 10 가지 형태로 구현되어 있습니다.
- FlatXmlDataSet
- XmlDataSet
- StreamingDataSet
- DatabaseDataSet
- QueryDataSet
- DefaultDataSet
- CompositeDataSet
- FilteredDataSet
- XlsDataSet
- ReplacementDataSet
DatabaseOperation
- DatabaseOperation.UPDATE
- DatabaseOperation.INSERT
- DatabaseOperation.DELETE
- DatabaseOperation.DELETE_ALL
- DatabaseOperation.TRUNCATE
- DatabaseOperation.REFRESH
- DatabaseOperation.CLEAN_INSERT
- DatabaseOperation.NONE
- CompositeOperation
- TransactionOperation
- IdentityInsertOperation
[편집] JCF3.0™ BaseDaoDBunitTestCase 적용 사례
package jcf.dao; import java.sql.Connection; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.MissingResourceException; import java.util.ResourceBundle; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dbunit.DatabaseTestCase; import org.dbunit.database.DatabaseConfig; import org.dbunit.database.IDatabaseConnection; import org.dbunit.dataset.IDataSet; import org.dbunit.ext.db2.Db2Connection; import org.dbunit.ext.db2.Db2DataTypeFactory; import org.dbunit.ext.mysql.MySqlConnection; import org.dbunit.ext.mysql.MySqlDataTypeFactory; import org.dbunit.ext.oracle.OracleConnection; import org.dbunit.ext.oracle.OracleDataTypeFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.ibatis.sqlmap.client.SqlMapClient; /** * Base class for running DAO tests. * @author mraible, kyong94 */ public class BaseDaoDBunitTestCase extends DatabaseTestCase { protected static Log log = LogFactory.getLog(BaseDaoDBunitTestCase.class); protected static ApplicationContext ctx = null; private SqlMapClient sqlMapClient=null; protected static ResourceBundle rb = null; // This static block ensures that Spring's BeanFactory is only loaded // once for all tests static { // the dao.type is written to the database.properties file // in properties.xml ResourceBundle db = ResourceBundle.getBundle("app"); String daoType = db.getString("dao.type"); if (log.isDebugEnabled()) { log.debug("daoType: " + daoType); } String[] paths = { "config/applicationContext.xml", "config/applicationContext-user.xml"}; ctx = new ClassPathXmlApplicationContext(paths); } public BaseDaoDBunitTestCase() { // Since a ResourceBundle is not required for each class, just // do a simple check to see if one exists String className = this.getClass().getName(); try { rb = ResourceBundle.getBundle(className); } catch (MissingResourceException mre) { // log.warn("No resource bundle found for: " + className); } } /** * Utility method to populate a javabean-style object with values from a * Properties file * @param obj * @return * @throws Exception */ protected Object populate(Object obj) throws Exception { // loop through all the beans methods and set its properties from // its .properties file Map map = new HashMap(); for (Enumeration keys = rb.getKeys(); keys.hasMoreElements();) { String key = (String) keys.nextElement(); map.put(key, rb.getString(key)); } BeanUtils.copyProperties(obj, map); return obj; } @Override protected IDatabaseConnection getConnection() throws Exception { return null; } @Override protected IDataSet getDataSet() throws Exception { return null; } protected IDatabaseConnection getConnection(String dbType) throws Exception { IDatabaseConnection connection= null; DatabaseConfig config = null; Connection sqlMapConnection = sqlMapClient.getDataSource().getConnection(); if (dbType.equalsIgnoreCase("oracle")) { connection = new OracleConnection(sqlMapConnection, sqlMapConnection.getMetaData().getUserName()); config = connection.getConfig(); config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new OracleDataTypeFactory()); } else if (dbType.equalsIgnoreCase("db2")) { connection = new Db2Connection(sqlMapConnection, sqlMapConnection.getMetaData().getUserName()); config = connection.getConfig(); config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new Db2DataTypeFactory()); } else if (dbType.equalsIgnoreCase("mysql")) { connection = new MySqlConnection(sqlMapConnection, sqlMapConnection.getMetaData().getUserName()); config = connection.getConfig(); config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory()); } System.out.println("# UserName: " + sqlMapConnection.getMetaData().getUserName()); System.out.println("# Schema: " + sqlMapConnection.getMetaData().getSchemas()); System.out.println("# Schema: " + connection.getSchema()); return connection; } public void init(String sqlMapClientId) throws Exception { sqlMapClient = (SqlMapClient) ctx.getBean(sqlMapClientId); } public SqlMapClient getSqlMapClient() { return sqlMapClient; } public void setSqlMapClient(SqlMapClient sqlMapClient) { this.sqlMapClient = sqlMapClient; } }
package jcf.showcase.user.dao; import java.io.FileInputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; import jcf.dao.BaseDaoDBunitTestCase; import jcf.showcase.code.model.Code; import jcf.showcase.user.model.User; import org.dbunit.database.DatabaseConnection; import org.dbunit.database.IDatabaseConnection; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.excel.XlsDataSet; import org.dbunit.operation.DatabaseOperation; import com.ibatis.sqlmap.client.SqlMapClient; public class UserDaoDBunitTest extends BaseDaoDBunitTestCase { private SqlMapClient sqlMapClient=null; private UserDao userDao=null; protected void setUp() throws Exception { System.out.println("setUp start"); init("sqlMapClient"); } @Override protected IDataSet getDataSet() throws Exception { IDataSet dataSet = new XlsDataSet(new FileInputStream("test/userDaoTestData.xls")); return dataSet; } @Override protected IDatabaseConnection getConnection() throws Exception { return new DatabaseConnection(sqlMapClient.getDataSource().getConnection()); } protected void tearDown() throws Exception { super.tearDown(); // DatabaseOperation.DELETE_ALL.execute(this.getConnection(), this.getDataSet()); System.out.println("tearDown end"); } public void init(String sqlMapClientId) throws Exception { userDao = (UserDao) ctx.getBean("userDao"); super.init(sqlMapClientId); sqlMapClient = super.getSqlMapClient(); } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void testSetUpIDataConnection() throws Exception { assertNotNull(this.getConnection()); } public void testInsertIDataSet() throws Exception { DatabaseOperation.CLEAN_INSERT.execute(this.getConnection("oracle"), this.getDataSet()); // DatabaseOperation.INSERT.execute(this.getConnection(), this.getDataSet()); } public void testFineUser() throws Exception { User user = new User(); String param = "5555"; user = (User) userDao.findUser(param); assertNotNull(user); assertEquals(user.getId(), "5555"); assertEquals(user.getName(), "5555"); } public void testFineUsers() throws Exception { List users = new ArrayList(); users = (List) userDao.findUsers(); assertNotNull(users); assertEquals(users.size(), 6); } public void testCreateUser() throws Exception { User user = new User(); Code code = new Code(); code.setCategory("seoul"); code.setId("seoul"); code.setName("seoul"); user.setId("7777"); user.setName("7777"); user.setPassword("7777"); user.setAddress(code); user.setDescription("7777"); user.setGender("F"); Date regDate = new Date(); regDate.setDate(20080228); user.setRegDate(regDate); user.setHasHouse("true"); userDao.createUser(user); User user2 = new User(); user2 = userDao.findUser("7777"); assertEquals(user.getId(),user2.getId()); assertEquals(user.getName(),user2.getName()); } public void testUpdateUser() throws Exception { User user = userDao.findUser("7777"); user.setName("8888"); userDao.updateUser(user); User user2 = userDao.findUser("7777"); assertEquals(user2.getName(),"8888"); } }
