`
zhengkaifl
  • 浏览: 24647 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

DBUnit扩展自定类型实现

    博客分类:
  • Java
阅读更多

 

       首先,要扩展DBUnit支持的数据类型,我们必须知道,自己要扩展的数据类型的一些工作情况:

a)驱动程序为该列返回什么JDBC类型;

b)驱动程序为这些对象返回什么Java类;

要解答上面的问题,我们可以用下面的方法来进行测试:

Public class PrintMetaData{
public static void main(String[] args) throws SQLException
{

     String sql = “select * from tableName order by 1”;

     Connnection conn = DataSourceUtils.getDataSource().getConnection();

     ResultSet rs = conn.createStatement().executeQuery(sql);

     ResultSetMetaData metaData = rs.getMetaData();

     System.out.println(“metaData.getColumnType”+metaData.getColumnType(列号,计数从1开始));

     while(rs.next())

{

    Object o = rs.getObject(1);

    System.out.println(“c.getClass() = ” + c.getClass());

    System.out.println(“c.toString() = ” + c.toString());

}

}

}

 

 

 

通过这样的方式我们可以清楚的知道自己需要扩展的类型,在驱动里的表现形式。有了这样的基础我们就可以开始扩展我们想要的数据类型了。(以下的内容我们以扩展一个Oracle里面的特殊字段类型TimeStamp with time zone为例)

首先我们需要为我们要扩展的类型定义出自己的OracleTimeStampTZDataType类,该类的实现如下:

import java.sql.Timestamp;

import java.text.SimpleDateFormat;

import java.util.Date;

import oracle.jdbc.OracleTypes;

import oracle.sql.TIMESTAMP;

import org.dbunit.dataset.datatype.AbstractDataType;

import org.dbunit.dataset.datatype.TypeCastException;

 

public class OracleTimeStampTZDataType extends AbstractDataType

{

   private static final String DATE_FORMATE = "yyyy-MM-dd hh:mm:ss";

 

   public OracleTimeStampTZDataType() 

   {

super("TIMESTAMPTZ", OracleTypes.TIMESTAMP, TIMESTAMP.class, false);

   }

 

   @Override

   public Object typeCast(Object value) throws TypeCastException 

   {

      

SimpleDateFormat formate = new SimpleDateFormat(DATE_FORMATE);

        Timestamp stamp =null;

        try

        {

         Date date = formate.parse((String)value);

         stamp = new Timestamp(date.getTime());

        }

      catch(Exception ex)

      {

         ex.printStackTrace();

      }

      return stamp;

   }

 

   public int compare(Object o1, Object o2) throws TypeCastException 

   {       

      return o1.toString().equals(o2.toString()) ? 0 : 1;     

   }   

}

 

 

 

定义完我们自己的数据类型后,我们还需要为自定义类型实现一个创建这个自定义对象的类型的工厂类,该类需要继承DBUnit中的DefaultDataTypeFactory类,具体实现如下:

import java.sql.Types;
import org.dbunit.dataset.datatype.BinaryStreamDataType;
import org.dbunit.dataset.datatype.DataType;
import org.dbunit.dataset.datatype.DataTypeException;
import org.dbunit.dataset.datatype.DefaultDataTypeFactory;
import org.dbunit.ext.oracle.OracleBlobDataType;
import org.dbunit.ext.oracle.OracleClobDataType;
import org.dbunit.ext.oracle.OracleNClobDataType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class OracleTimeStampTZDataTypeFactory extends DefaultDataTypeFactory
{
    /**
     * Logger for this class
     */
    private static final Logger logger = LoggerFactory.getLogger(OracleTimeStampTZDataTypeFactory.class);

    public static final DataType ORACLE_BLOB = new OracleBlobDataType();
    public static final DataType ORACLE_CLOB = new OracleClobDataType();
    public static final DataType ORACLE_NCLOB = new OracleNClobDataType();
    public static final DataType LONG_RAW = new BinaryStreamDataType(
            "LONG RAW", Types.LONGVARBINARY);
    public static final DataType ORACLE_TIMESTAMPTZ = new OracleTimeStampTZDataType();

    public DataType createDataType(int sqlType, String sqlTypeName) throws DataTypeException
    {
        logger.debug("createDataType(sqlType=" + sqlType + ", sqlTypeName=" + sqlTypeName + ") - start");

        // Map Oracle DATE to TIMESTAMP
        if (sqlType == Types.DATE)
        {
            return DataType.TIMESTAMP;
        }
        
        // TIMESTAMOTZ
        if(sqlTypeName.startsWith("TIMESTAMP(6) WITH TIME ZONE"))
        {
        	return ORACLE_TIMESTAMPTZ;
        }

        // TIMESTAMP
        if (sqlTypeName.startsWith("TIMESTAMP"))
        {
            return DataType.TIMESTAMP;
        }
        
        // BLOB
        if ("BLOB".equals(sqlTypeName))
        {
            return ORACLE_BLOB;
        }

        // CLOB
        if ("CLOB".equals(sqlTypeName))
        {
            return ORACLE_CLOB;
        }
        
        // NCLOB
        if  ("NCLOB".equals(sqlTypeName))
        {
            return ORACLE_NCLOB;
        }

        // NVARCHAR2
        if ("NVARCHAR2".equals(sqlTypeName))
        {
            return DataType.VARCHAR;
        }

		// NCHAR
        if (sqlTypeName.startsWith("NCHAR"))
        {
            return DataType.CHAR;
        }

        // FLOAT
        if ("FLOAT".equals(sqlTypeName))
        {
            return DataType.FLOAT;
        }

        // LONG RAW
        if (LONG_RAW.toString().equals(sqlTypeName))
        {
            return LONG_RAW;
        }

        return super.createDataType(sqlType, sqlTypeName);
    }
}

 

至此我们已经完成了自定义类型的相关定义,但是要让DBUnit支持我们的自定义类型,我们还需要实现一个针对我们自定义类型的数据库连接对象OracleTZConnection,同样该类需要继承DBUnitDatabaseConnection类,具体的实现如下:

import java.sql.Connection;
import org.dbunit.database.DatabaseConfig;
import org.dbunit.database.DatabaseConnection;

public class OracleTZConnection extends DatabaseConnection{
	
    public OracleTZConnection(Connection connection, String schema)
    {
        super(connection, schema != null ? schema.toUpperCase() : null);
        getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
                new OracleTimeStampTZDataTypeFactory());
    }
}

 

OK,完成上面这些定义之后,我们已经完成了一个自定义类型在DBUnit中的扩展。最后给出一个使用该自定义类型做DBUnit测试的小的demo代码:

import org.dbunit.DBTestCase;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.junit.Before;

import delete.Test;

public class MyTest extends DBTestCase{

	@Override
	protected IDataSet getDataSet() throws Exception {
		return new FlatXmlDataSet(this.getClass().getResourceAsStream("MyTest.xml"));
	}

	@Override
	protected IDatabaseConnection getConnection() throws Exception
	{     
		return new OracleTZConnection(Test.getConnection(), "ZK");   
	}
	
	@Before
	public void setUp() throws Exception
	{
		DatabaseOperation.INSERT.execute(getConnection(), getDataSet());
	}
	
	public void testTT()
	{}
}

分享到:
评论

相关推荐

    DBUNIT使用

    DbUnit 是一种用于数据库集成测试的重要工具,它提供了TestCase 子类,用户可以在自己的测试类中扩展它们,但也可以独立于 JUnit 以其他方式来使用 DbUnit。DbUnit 的主要用途是准备数据库和验证数据库,它可以在...

    dbunit-2.4.9 源码

    通过深入学习这些 API,开发者可以自定义数据导入导出格式,实现与特定数据库系统的兼容,或者扩展 DBUnit 的功能。同时,结合单元测试框架(如 JUnit 或 TestNG),可以编写高效且可靠的数据库测试用例。 在实际...

    dbunit-2.4.7所有jar以及dbunit入门教程

    DBUnit 是一个开源的 Java 库,专门用于数据库测试,它是 xUnit 测试框架(如 JUnit)的一个扩展。在数据库驱动的项目中,DBUnit 可以帮助开发者确保数据库状态的一致性,使得测试更加可靠。DBUnit 2.4.7 版本包含了...

    dbunit2.2

    8. **扩展性**:DBUnit 的设计允许用户通过实现IType和IDataFactory接口来自定义数据处理方式,增强了其灵活性和可扩展性。 9. **与其他测试框架集成**:除了JUnit,DBUnit 还可以与TestNG等其他测试框架集成,为...

    Dbunit数据库连接下载

    Dbunit 是一个强大的Java库,专门用于数据库的测试和数据管理。...通过与Flash的结合,还能实现前后端的深度交互,增强应用的数据库管理能力。正确理解和使用Dbunit,可以极大地提高开发效率和代码质量。

    DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类

    DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类DBUNIT 基类...

    dbunit单元测试

    DBUnit 是一个强大的开源工具,专门用于数据库的单元测试,它是JUnit框架的一个扩展,使得开发者在进行测试时能够更有效地管理和控制数据库的状态。这个工具的主要目的是确保测试的隔离性和可重复性,使得每次测试都...

    dbunit测试demo

    8. **自定义类型处理器**:DBUnit 默认支持基本数据类型,对于复杂对象或自定义类型,需要编写自定义的类型处理器来确保数据的正确序列化和反序列化。 通过上述步骤,开发者可以利用 DBUnit 创建数据库驱动的测试,...

    dbunit开发文档

    DBUnit 是一个开源的 Java 库,专门用于数据库测试,它是 xUnit 测试框架(如 JUnit)的一个扩展。在数据库驱动的项目中,DBUnit 提供了一种结构化的方法来设置和验证数据库状态,从而确保测试的一致性和可靠性。这...

    dbunit使用实例

    DBUnit 是一个开源的 Java 库,专门用于数据库测试,它是 xUnit 测试框架(如 JUnit)的一个扩展。在软件开发中,确保数据库状态的一致性和准确性是至关重要的,尤其是在进行集成测试时。DBUnit 提供了一种简单且...

    DbUnit入门实战

    DbUnit 是一个专门针对数据库测试的 JUnit 扩展,它可以将测试对象数据库置于一个测试轮回之间的状态。DbUnit 的设计理念是,在测试之前,备份数据库,然后给对象数据库植入我们需要的准备数据,最后,在测试完毕后...

    dbunit帮助文档(HTML版)

    DBUnit是一款开源的Java库,专门用于数据库测试,它遵循TestNG或JUnit测试框架。这个HTML版的帮助文档是从官方站点`http://www.dbunit.org/apidocs/index.html`获取的,包含了DBUnit的所有核心功能和用法的详细说明...

    dbunit-2.0-src.zip_dbunit src_dbunit-2.1-src

    4. 数据类型支持:DBUnit支持多种数据库数据类型,包括基本类型和复杂类型,如BLOB和CLOB。 5. 载入和卸载数据:`IDataSet`接口是DBUnit处理数据集的核心,它定义了如何加载和卸载数据到数据库。`FlatXmlDataSet`、...

    使用EJB+Struts1.3+Ant+Cactus+DbUnit+JMeter+StrutsTest实现测试2

    本项目利用一系列强大的工具,如EJB(Enterprise JavaBeans)、Struts 1.3、Ant构建工具、Cactus测试框架、DbUnit数据库单元测试工具、JMeter性能测试工具以及StrutsTest扩展,来实现一个全面的测试流程。...

    DBUnit最佳实践之使用ant命令

    DBUnit 是一个 Java 开发者常用的数据库测试工具,它与JUnit等测试框架配合,能够帮助开发者在测试...通过以上实践,我们可以高效地利用DBUnit与Ant集成,实现数据库的自动化测试和管理,提升项目的测试效率和质量。

    介绍dbunit的使用和原理,核心组件介绍

    DbUnit 是一个针对数据库驱动项目的JUnit扩展,同时也可用于Ant构建工具。它的主要功能是能够将数据库数据导出到XML数据集,并从XML数据集中导入,从而支持数据库的测试和数据管理。DbUnit还允许你验证数据库中的...

    DBUnit最佳实践之数据备份与恢复

    DBUnit是一个JUnit扩展,它提供了一种结构化的方式来导入和导出数据库数据,通常以XML或CSV格式。这使得在不同测试用例之间保持数据库状态的一致性成为可能。通过在测试前后执行特定的数据操作,我们可以确保每个...

    使用EJB+Struts1.3+Ant+Cactus+DbUnit+JMeter+StrutsTest实现测试3

    本项目"使用EJB+Struts1.3+Ant+Cactus+DbUnit+JMeter+StrutsTest实现测试3"正是针对这一目标进行的实践。下面将详细介绍这些技术及其在测试中的应用。 **EJB(Enterprise JavaBeans)** 是Java平台上的企业级组件...

    dbunit使用必需Jar包

    为了正确使用 DBUnit,你需要将这些 Jar 包添加到你的项目类路径中,这可以通过配置构建工具(如 Maven 或 Gradle)或者手动设置 IDE 的类路径来实现。 在实际使用 DBUnit 进行测试时,通常会执行以下步骤: 1. **...

Global site tag (gtag.js) - Google Analytics