一个通用的单元测试框架的思考和设计08-实现篇-在testcase代码中执行sql语句

一个通用的单元测试框架的思考和设计01-思考篇

一个通用的单元测试框架的思考和设计02-设计篇

一个通用的单元测试框架的思考和设计03-实现篇-核心类源码

一个通用的单元测试框架的思考和设计04-实现篇-自动管理测试数据

一个通用的单元测试框架的思考和设计05-实现篇-Guice框架启动与自动注入

一个通用的单元测试框架的思考和设计06-实现篇-自动管理测试数据-如何临时关闭数据外键约束

一个通用的单元测试框架的思考和设计07-实现篇-自动管理测试数据-如何为自增长主键id赋值

有时候,仅仅依靠框架提供的xml方式来插入和删除数据时不够的,有的时候需要在测试代码中执行一些sql语句,以下是介绍如何便捷的做到这一点

前几章节我们介绍过了,我们是靠dbuint来进行测试数据的维护的,而dbunit给我们提供了一个非常好的接口IDatabaseTester,这个接口中定义了一些与数据库连接相关的操作,在我们的框架中也是用这种方式来维护数据库连接的。

1.定义一个接口

public interface IDatabaseTesterAware {
	/**
	 * 设置Tester对象
	 * @param databaseTester
	 * @see org.dbunit.IDatabaseTester
	 */
	public void setIDatabaseTester(IDatabaseTester databaseTester);
}
2.在我们的testCase类中实现该接口-一般在basetestcase中实现,具体的测试类直接可以使用了

@TestExecutionListeners({ XmlDatasetProviderListener.class, TransactionalTestExecutionListener.class })
public class BaseHopTestCase extends AbstractJUnit4SpringContextTests implements IDatabaseTesterAware{
	protected IDatabaseTester databaseTester;
	@Override
	public void setIDatabaseTester(IDatabaseTester databaseTester) {
		this.databaseTester = databaseTester;
	}
}
3.在框架中将IDatabaseTester注入

找到我们框架里的DatasetProviderListener prepareTestInstance方法,在该方法的最后

		//将测试IDatabaseTester注入到测试类中
		if(testInstance instanceof IDatabaseTesterAware){//在这里为testcase中的IDatabaseTester赋值
			IDatabaseTesterAware databaseTesterAware = (IDatabaseTesterAware)testInstance;
			databaseTesterAware.setIDatabaseTester(databaseTester);
		}

这样我们的基类testcase中就可以定义常用到的方法了,如下

@TestExecutionListeners({ XmlDatasetProviderListener.class, TransactionalTestExecutionListener.class })

public class BaseTestCase extends AbstractJUnit4SpringContextTests implements IDatabaseTesterAware{

    protected IDatabaseTester databaseTester;

    @Override

    public void setIDatabaseTester(IDatabaseTester databaseTester) {

        this.databaseTester = databaseTester;

    }

    /**

     * 利用dbunit的connection执行sql语句

     * @param sql

     */

    protected void executeSQL(String sql){

        Connection connection = null;

        Statement statement = null;

        try {

            connection = databaseTester.getConnection().getConnection();

            statement = connection.createStatement();

            statement.execute(sql);

        }catch (Exception e) {

            ReflectionUtils.handleReflectionException(e);

        }finally{

            closeStatement(statement);

            closeConnection(connection);

        }

    }

    /**

     * 关闭数据库连接

     * @param connection

     */

    protected void closeConnection(Connection connection) {

        if(connection != null){

            try {

                connection.close();

            } catch (SQLException e) {

                ReflectionUtils.handleReflectionException(e);

            }

        }

    }

    /**

     * 关闭sql语句对象

     * @param statement

     */

    protected void closeStatement(Statement statement){

        if(statement != null){

            try {

                statement.close();

            } catch (SQLException e) {

                ReflectionUtils.handleReflectionException(e);

            }

        }

    }

    

    /**

     * 生成默认的刷新物化视图的sql语句--仅限于oracle

     * @param materializedViewName 物化视图的名字

     * @return

     */

    protected String generateRefeshMaterializedViewSql(String materializedViewName){

        StringBuffer stringBuffer = new StringBuffer();

        stringBuffer.append("BEGIN")

          .append("  DBMS_SNAPSHOT.REFRESH")

          .append("  (LIST                 => '")

          .append(materializedViewName).append("'")

          .append("  ,PUSH_DEFERRED_RPC    => TRUE")

          .append("  ,REFRESH_AFTER_ERRORS => FALSE")

          .append("  ,PURGE_OPTION         => 1")

          .append("  ,PARALLELISM          => 0")

          .append("  ,ATOMIC_REFRESH       => TRUE")

          .append("  ,NESTED               => FALSE);")

          .append("  END;");

        return stringBuffer.toString();

    }

    

    /**

     * 刷新指定的物化视图

     * @param materializedViewName 物化视图名字

     */

    protected void refeshMaterializedView(String materializedViewName){

        executeSQL(generateRefeshMaterializedViewSql(materializedViewName));

    }

}



其中有一个重要的功能就是刷新物化视图的功能


你可能感兴趣的:(sql语句)