`

dbunit ReplacementDataSet使用

阅读更多
注: 本篇的测试使用的数据库为Oracle, 其它数据库的情况可能会有所不同。




ReplacementDataSet继承AbstractDataSet, 而AbstractDataSet实现了IDataSet接口。
因此Dbunit中任何以IDataSet为参数对象类型的方法都可以使用ReplacementDataSet.

下面是这篇教程的应用场景:


Channel类:
@Entity
@Table(name="t_channel")
@SequenceGenerator(name="TestSEQ",sequenceName="test_seq",allocationSize=1,initialValue=100)
public class Channel {

	/**
	 * 栏目的主键
	 */
	private int id;
	
	
	/**
	 * 栏目的名称
	 */
	private String name;

	/**
	 * 父类栏目
	 */
	private Channel parent;

@ManyToOne
	@JoinColumn(name="pid")
	public Channel getParent() {
		return parent;
	}


	public void setParent(Channel parent) {
		this.parent = parent;
	}

...

}


这里的Channel是一个树形结构,每一个Channel有它的父级和子级。
在数据库中, 用一个pid外键关联到自身的id。

<t_channel id="0" name="网站系统栏目"  pid="null"/>
<t_channel id="1" name="用户管理模块"  pid="0"/>

<t_channel id="2" name="用户管理1"  pid="1"/>
<t_channel id="3" name="用户管理2"  pid="1"/>
<t_channel id="4" name="用户管理3"  pid="1"/>
<t_channel id="5" name="用户管理4"  pid="1"/>

测试数据结构如上所示:
------------------------------------
网站系统栏目
           -用户管理模块
                    -用户管理1
                    -用户管理2
                    -用户管理3
                    -用户管理4
-------------------------------------

网站的根栏目是 网站系统栏目, id=0, pid=null
然后是 用户管理模块  id=1, pid=0,
接下来是用户管理1,2,3,4    id为别为2,3,4,5 , pid都是1, 也就是用户管理模块的子模块。



测试:
1.
 IDataSet ds=createDataSet("topic"); //createDataSet(String filename)通过文件输入流,返回一个测试数据对象。详情见入门教程
 DatabaseOperation.CLEAN_INSERT.execute(dbunitCon,ds);

上面的代码会情况数据库,并插入xml文件中的测试数据。
但是运行之后会意外的发现错误信息:

org.dbunit.dataset.datatype.TypeCastException: Error casting value for table 't_channel' and column 'PID'
at org.dbunit.operation.AbstractBatchOperation.execute(AbstractBatchOperation.java:193)
at com.lj.core.dao.TestChannelDao.setUp(TestChannelDao.java:63)
Caused by: org.dbunit.dataset.datatype.TypeCastException: Unable to typecast value <null> of type <java.lang.String> to DECIMAL
Caused by: java.lang.NumberFormatException
at java.math.BigDecimal.<init>(BigDecimal.java:368)
at java.math.BigDecimal.<init>(BigDecimal.java:647)
at org.dbunit.dataset.datatype.NumberDataType.typeCast(NumberDataType.java:79)
... 37 more



也就是说,pid=null这里是不能被插入数据库的。
这时我们会首先把它去掉,看看能不能解决问题。


2. 于是我们改成<t_channel id="0" name="网站系统栏目"  />
再次运行测试。

结果发现数据被导入数据库, 只不过pid那一列全部没有任何数值。




看来测试数据的pid是不能去掉的。


3. 要解决这个问题, 就必须使用ReplacementDataSet,将xml测试文件中的字符串的"null"转换成实际的null

代码如下:
	 IDataSet ds=createDataSet("topic");
		 
	 ReplacementDataSet rds=new ReplacementDataSet(ds);
         rds.addReplacementObject("null", null); //将“null”转换成null.
         DatabaseOperation.CLEAN_INSERT.execute(dbunitCon,rds);


此时将网站系统栏目加入 pid="null",
再次运行测试代码,就可以看到数据被正常加入了进去。




网站系统栏目那里的pid是没有值的,就达到我们的需求了。
  • 大小: 43.3 KB
  • 大小: 54.1 KB
  • 大小: 61.6 KB
分享到:
评论

相关推荐

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

    DbUnit 是一个针对数据库驱动项目的JUnit...在实际项目中,结合使用DbUnit和其他单元测试框架(如JUnit或TestNG),可以形成强大的测试解决方案,确保整个应用程序的质量,特别是在金融等对数据精确度要求极高的领域。

    dbunit使用必需Jar包

    DBUnit 是一个开源的 Java 工具,它与JUnit结合使用,用于数据库的测试驱动开发(TDD)。在Java应用程序的测试过程中,确保数据库状态的一致性是非常重要的,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 到项目中,以及使用 DBUnit 这个工具进行数据库管理。 综上所述,DBUnit 是一个强大的数据库测试工具,通过 ...

    dbunit使用实例

    4. **数据库连接(Database Connection)**: 在使用 DBUnit 之前,需要配置一个数据库连接。这可以通过 JDBC URL、用户名和密码实现。 ### 使用 DBUnit 的步骤 1. **初始化**: 首先,你需要创建一个 `...

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

    在使用 DBUnit 进行测试时,首先需要引入 dbunit-2.4.7.jar 和其他必要的依赖库,如 JDBC 驱动。接下来,创建一个 `IDatabaseConnection` 实例,该实例代表与数据库的连接。然后,可以使用 `DatabaseConfig` 来配置 ...

    DBUNIT使用手册

    DBUNIT的核心在于它将数据库状态抽象为可预知的数据集,允许开发者使用XML等格式定义测试数据,确保测试的可重复性和独立性。 在安装DBUNIT时,你需要下载最新版本的DBUNIT开发包,例如DBUNIT-2.4.8.zip,并将其...

    dbunit-2.4.9 源码

    DBUnit 是一个开源的 Java 库,专门用于数据库测试,它是 xUnit 测试框架的一部分,提供...通过分析其源码和参考 API 文档,开发者不仅可以掌握如何使用 DBUnit,还能学习到数据库操作、测试策略和设计模式等相关知识。

    DBUnit使用文档

    DBUnit 是一个 Java 开发工具,专门用于数据库的测试,它与单元测试框架如 JUnit 配合使用,确保在测试前后数据库的状态正确无误。DBUnit 的核心思想是在执行测试之前清空并填充测试数据,然后在测试完成后恢复原始...

    DBUnit最佳实践之使用ant命令

    以下是一个简单的Ant构建文件(build.xml)片段,展示了如何使用DBUnit进行数据初始化: ```xml &lt;project name="DBUnit-Ant-Example" default="run-dbunit"&gt; &lt;taskdef name="dbunit" classname="org.dbunit.ant....

    Dbunit数据库连接下载

    doc 文件夹可能包含了Dbunit的API文档或者其他技术文档,这些文档对于理解和使用Dbunit非常有帮助,它们详细解释了各个类和方法的功能,以及如何在项目中正确使用。 总的来说,Dbunit是一个强大的数据库测试框架,...

    dbunit帮助文档(HTML版)

    DBUnit通过使用XML或Flat CSV格式的数据集来管理这些操作,使得数据库状态的管理变得标准化且可重复。 ### 主要功能 1. **数据导入/导出**:DBUnit可以将数据从数据库导出到XML或CSV文件,也可以将这些文件中的...

    DBUnit 进行单元测试

    使用DBUnit,我们可以创建一个数据集(通常为XML或CSV格式),该数据集包含用于初始化数据库的记录。在测试开始前,这些数据会被加载到数据库中,形成一个已知的起点。测试执行完毕后,还可以选择将数据库恢复到初始...

    通过DBUNIT做批量对比测试

    以下是使用 DBUNIT 进行批量对比测试的主要步骤: 1. **准备数据集**:首先,你需要创建数据集文件,这些文件描述了测试前后期望的数据库状态。数据集通常包含列名和对应的值,可以使用 CSV(逗号分隔值)或 XML ...

    使用dbunit测试数据库

    在使用 DbUnit 进行数据库测试时,首先需要准备测试环境。在这个例子中,我们创建了一个名为 "student" 的测试数据库,该数据库是在 MySql 中建立的。接着,在一个名为 "DBUnitSample" 的 Java 工程中,导入了 ...

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

    通过阅读这个文档,开发者可以更快地理解和掌握DBUnit的使用。 总的来说,DBUnit作为一个强大的数据库测试工具,极大地简化了数据库驱动的单元测试工作。无论是对于开发人员还是测试人员,理解并熟练运用DBUnit都是...

    dbunit开发文档

    1. JUnit 集成:DBUnit 可以很容易地与 JUnit 结合使用,通过 `@Before` 和 `@After` 注解来设置和清理数据库。 2. Spring 集成:如果你的项目使用 Spring,可以利用 Spring's `DbUnitTestExecutionListener` 来...

    dbunit测试demo

    标题“dbunit测试demo”表明这是一个关于如何使用 DBUnit 进行测试的实例。描述中提到的链接指向了一篇博客文章,这可能包含了一个具体的 DBUnit 测试用例的详细步骤和解释。尽管我们无法直接访问该链接,但我们可以...

    单元测试JUnit4和DbUnit

    DbUnit的使用通常与JUnit结合,首先需要在测试类中导入DbUnit的相关库,并配置数据库连接信息。在测试前,使用DbUnit的DatabaseConfig和DataSet来加载XML或CSV格式的测试数据到数据库。典型的流程包括:连接数据库、...

Global site tag (gtag.js) - Google Analytics