DBunit Test

From JCFWiKi

Jump to: navigation, search

목차

[편집] 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");
	}
}