package xxx.framework.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
import org.dbunit.Assertion;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.CompositeTable;
import org.dbunit.dataset.FilteredTableMetaData;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.filter.DefaultColumnFilter;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
import junit.framework.TestCase;
public class DBTestCase extends TestCase {
	 private DBinfo info = DBinfo.getInstance();
	/**
	 * コンストラクタ。
	 * 
	 */
	public DBTestCase() {
		super();
			
	}
	/**
	 * 指定したテーブルのデータでXMLFileを作成します。
	 * @param arrayTables 対象テーブル名
	 * @param sFileName xmlファイル名
	 */
	protected void exportOp(String[] arrayTables, String sFileName)throws Exception {
		info.init();
		exportTable(arrayTables,new File(info.sExportDir_, sFileName));
	}
	
	/**
	 * XMLFileをDBに書き込みます。
	 * @param sFileName xmlファイル名
	 */
	protected void importOp(String sFileName)throws Exception {
		info.init();
 		importTable(new File(info.sExportDir_, sFileName));
	}
	/**
	 * 指定したテーブルの現在データとXMLFileを比較します。
	 * @param arrayTables 対象テーブル名
	 * @param sFileName xmlファイル名
	 */
	protected void compareOp(String[] arrayTables, String sFileName) throws Exception{
		info.init();
		compareTable(arrayTables,new File(info.sExportDir_,sFileName),null);	
	}
	/**
	 * 指定したテーブルの現在データとXMLFileを比較します。
	 * @param arrayTables 対象テーブル名
	 * @param sFileName xmlファイル名
	 * @param columns 比較対象外とするカラム名
	 */
	protected void compareOp(String[] arrayTables, String sFileName,String[] columns) throws Exception{
		info.init();
		compareTable(arrayTables,new File(info.sExportDir_,sFileName),columns);	
	}
	private void compareTable(String[] arrayTables, File file,String[] columns) throws Exception {
		IDatabaseConnection connection = null;
		try {
			connection = getConnection();
			QueryDataSet partialDataSet = new QueryDataSet(connection);
			for (int i = 0; i < arrayTables.length; i++) {
				IDataSet databaseDataSet = getConnection().createDataSet();
				ITable actualTable = databaseDataSet.getTable(arrayTables[i]);
				IDataSet expectedDataSet = new FlatXmlDataSet(file);
				ITable expectedTable = expectedDataSet.getTable(arrayTables[i]);
				if(columns == null){
					Assertion.assertEquals(actualTable, expectedTable);
				}else{
				    DefaultColumnFilter columnFilter = new DefaultColumnFilter();
				    for(int x = 0; x < columns.length; x++)	{
					    columnFilter.excludeColumn(columns[x]);
				    }
				    FilteredTableMetaData metaData = new FilteredTableMetaData(actualTable.getTableMetaData(), columnFilter);
				    ITable filteredTable = new CompositeTable(metaData, actualTable);
				    Assertion.assertEquals(filteredTable, expectedTable);
				}
			}		
		}finally {
			if (connection != null) {
				connection.close();
			}
		}
	}
	
	
	private void importTable(File file) throws Exception {
		IDatabaseConnection connection = null;
		try {
		connection = getConnection();
		FlatXmlDataSet dataSet = new FlatXmlDataSet(file);
		DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
		} finally {
			if (connection != null) {
				connection.close();
			}
		}
	}
	private void exportTable(String[] arrayTables,File file) throws Exception{
		IDatabaseConnection connection = null;
		try {
		connection = getConnection();
		QueryDataSet partialDataSet = new QueryDataSet(connection);
		for (int i = 0; i < arrayTables.length; i++) {
			partialDataSet.addTable(arrayTables[i]);
		}
			FlatXmlDataSet.write(partialDataSet, new FileOutputStream(file));
		} finally {
			if (connection != null) {
				connection.close();
			}
		}
	}
	
	private IDatabaseConnection getConnection()throws Exception {
		Class driverClass = 
	     Class.forName(info.sDriver_);
		Connection jdbcConnection = 
		 DriverManager.getConnection(
		  info.sUrl_, info.sUser_, info.sPassword_);
	        
		return new DatabaseConnection(jdbcConnection);
	}
	private void operation(DatabaseOperation operation,IDataSet dataSet)throws Exception {
		IDatabaseConnection connection = null;
		try {
			connection = getConnection();
			operation.execute(connection, dataSet);
		} finally {
			if (connection != null) {
				connection.close();
			}
		}
	}
	private static class DBinfo{
		private static final DBinfo INSTANCE = new DBinfo();
		private boolean initialrized;
		private Properties prop;
		public String sDriver_;
		public String sUrl_;
		public String sUser_;
		public String sPassword_;
		public String sSchema_;
		public String sExportDir_;
		public void init() throws IOException, ClassNotFoundException {
			if (initialrized) {
				return;
			}
			synchronized (this) {
				prop = new Properties();
				InputStream resourceStream =
				ClassLoader.getSystemResourceAsStream("dbunit.properties");
				if (resourceStream == null) {
					System.err.println("クラスパスにdbunit.propertiesがありません!!");
				}
				prop.load(resourceStream);
				sDriver_ = prop.getProperty("driver");
				sUrl_ = prop.getProperty("url");
				sUser_ = prop.getProperty("user");
				sPassword_ = prop.getProperty("password");
				sSchema_ = prop.getProperty("schema");
				sExportDir_ = prop.getProperty("exportDir");
				Class.forName(sDriver_);
				initialrized = true;
			}
		}
		public static DBinfo getInstance() {
			return INSTANCE;
		}
	}
}
 
댓글 없음:
새 댓글을 작성할 수 없습니다.