一DbUnit数据管理策略介绍
DbUnit中操作数据库的接口动作都在DatabaseOperation中
public abstract class DatabaseOperation
{
public static final DatabaseOperation NONE=new DummyOperation();//DO NONE
public static final DatabaseOperation UPDATE = new UpdateOperation();//根据数据内容更新表中数据
public static final DatabaseOperation INSERT = new InsertOperation();//将数据内容插入表,可能会违反主键唯一性元素
public static final DatabaseOperation REFRESH = new RefreshOperation();//如果表中存在数据对对应的数据则更新,不存在则插入
public static final DatabaseOperation DELETE = new DeleteOperation();//从表中删除数据中对应的内容
public static final DatabaseOperation DELETE_ALL = new DeleteALLOperation();//删除表中所有数据
public static final DatabaseOperation TRUNCATE_TABLE = new TruncateTableOperation();//执行truncate table指令
public static final DatabaseOperation CLEAN_INSERT = new CompositeOperation(DELETE_ALL,INSERT);先执行DELETE_ALL,再执行INSERT;
public static final DatabaseOperation TRANSACTION(DatabaseOperation operation)
{
return new TransactionOperation(operation);
}
public static final DatabaseOperation CLOSE_CONNECTION(DatabaseOpetaion opetaion)
{
return new CloseConnectionOperation(operation);
}
public abstract void execute(IDatabaseConnection connection,IDataSet dataset) throws DatabaseUnitException,SQLException;
private static class DummyOperation extends DatabaseOperation
{
public void execute(IDatabaseConnection connection,IDataSet dataset)
{
}
}
}
DbUnit使用
DatabaseConnection connection = new DatabaseConnection(sqlConnection,schemaName);
XlsDataSet dataSet = new XlsDataSet(new DfaultResourceLoader().getResource("excel.xls").getInputStram());
DatabaseOperation.INSERT.execute(connection,dataSet);
二、Unitils的测试数据管理方式简介
Unitils就是对上述Dbunit的数据管理进行封装。Unitils默认提供四个数据装载策略:CleanInsertLoadStrategy、InsertLoadStrategy、RefreshLoadStrategy、UpdateloadStrategy。
CleanInsertLoadStrategy:DELETE_ALL——>INSERT 这种测试策略使用前会破坏原有数据库,一般不使用。但是如果有单独的非共享的测试数据库,这种也有独到的好处。
public class CleanInsertLoadStrategy extends BaseDataSetLoadStrategy
{
@Override
public viod doExecute(DbUnitDatabaseConnection dbUnitDatabaseConnection,IDataSet dataset) thows DatabaseUnitException,SQLException
{
DatabaseOperation.CLEAN_INSERT.excute(dbUnitDatabaseConnection,dataSet);
}
}
InsertLoadStrategy:(Dbunit中的insert)很可能造成主键唯一性和约束性问题
public class InsertLoadStrategy extends BaseDataSetLoadStrategy
{
@Override
public void doExecute(DbUnitDatabaseConnection dbUnitDatabaseConnection,IDataSet dataset) throws DatabaseUnitException,SQLException{
DatabaseOperation.INSERT.execute(dbUnitDatabaseConnection,dataset);
}
}
RfefreshLoadStrategy:(Dbunit中的Refresh)检查数据库中是否有和dataset中相同的主键数据,如果有则数据库中数据进行更新,如果无则插入数据库
public class RefreshLoadStrategy extends BaseDataSetLoadStrategy
{
@Override
public viod doExecute(DbUnitDatabaseConnection dbUnitDatabaseConnection,IDataSet dataset) thows DatabaseUnitException,SQLException(
DatabaseOperation.REFRESH.execute(dbUnitDatabaseConnection,dataSet);
}
UpdateloadStrategy:按主键更新到数据库,若数据库没有此对应主键关联的数据,则不做任何处理。
public class UpdateLoadStrategy extends BaseDataSetLoadStrategy
{
@Override
protected void doExecute(DbUnitDatabaseConnection dbUnitDatabaseConnection,IDataSet dataSet) throws DatabaseUnitException,SQLException(
DatabaseOperation.UPDATE.execute(dbUnitDatabaseConneciont,datasSet);
)
}