注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

让一切都逝去吧

排骨炖泥菜/猪肝炒苹果/鱼籽狗肉汤/狗头薏米汤

 
 
 

日志

 
 

dbunit-maven-plugin  

2013-03-19 22:32:43|  分类: 项目管理 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
      参考http://unmi.cc/dbunit-maven-test-data。里面有说到dbunit-maven-plugin(http://mojo.codehaus.org/dbunit-maven-plugin)和maven-dbunit-plugin(http://maven-plugins.sourceforge.net/)。后面那个url在我测试时无法访问就没有看了。
      pom.xml
  <build>
    <finalName>junit</finalName>
    
    <plugins>
    <plugin>
    <groupId>org.codehaus.mojo</groupId> 
            <artifactId>dbunit-maven-plugin</artifactId>
            <version>1.0-beta-3</version> 
            <configuration> 
                <driver>com.mysql.jdbc.Driver</driver> 
                <url>jdbc:mysql://localhost/test?zeroDateTimeBehavior=convertToNull</url> 
                <username>test</username> 
                <password>test</password> 
                <dataTypeFactoryName>org.dbunit.ext.mysql.MySqlDataTypeFactory</dataTypeFactoryName> 
                <metadataHandlerName>org.dbunit.ext.mysql.MySqlMetadataHandler</metadataHandlerName> 
                <encoding>utf-8</encoding> 
                <src>target/dbunit/export.xml</src><!--compare 和 operation 要用到它 -->
                <type>CLEAN_INSERT</type><!--operation 要用到它-->
            </configuration>
            <dependencies> 
                <dependency> 
                    <groupId>mysql</groupId> 
                    <artifactId>mysql-connector-java</artifactId> 
                    <version>5.1.24</version> 
                </dependency> 
            </dependencies>
    </plugin>
    </plugins>
  </build>
      以下是摘录
dbunit:compare 比较数据库与数据文件中的内容,相同则提示成功,不同则报异常
dbunit:export 导出数据库内容到数据文件中,默认是 xml 格式的数据
dbunit:help 看帮助的,要看 goal 的更详细的帮助可用:mvn dbunit:help -Ddetail=true -Dgoal=<goal-name>
dbunit:operation 可用来执行数据库操作,如插入、清除数据,清除并插件数据等。用的多的应该是 CLEAN_INSERT。(dbunit说明中有详细说明

执行 mvn dbunit:export 你会看到生成了一个 target/dbunit/export.xml,包含了库中所有表的数据。

执行 mvn dbunit:compare 会将 <src> 指定的数据文件与数据库内容对比,相同则提示成功,不同就会报异常,由于我们上面指定的源文件是刚刚导出的 target/dbunit/export.xml,所以比较是成功的。

现在把数据库清空掉,然后执行 mvn dbunit:operation 后,你会发现数据库中的内容又原来的一样,是因为这个命令把数据文件 <src> 指示的 target/dbunit/export.xml 的数据导入到了数据库中。其实在执行 CLEAN_INSERT 时会先把数据库中的数据清理掉的。

dbunit:operation goal 的 type 取值有:UPDATE, INSERT, DELETE, DELETE_ALL, REFRESH, CLEAN_INSERT, MSSQL_INSERT, MSSQL_REFRESH, MSSQL_CLEAN_INSERT。

加上 -e 参数执行,mvn dbunit:export -e (要是执行 mvn dbunit:export -X 会有更多的信息)会看到详细的异常栈。

Caused by: java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 8 to TIMESTAMP.
Caused by: java.sql.SQLException: Value '[B@297ffb' can not be represented as java.sql.Timestamp

这样的错误,那要请为你的 MySql jdbc 链接字符串加上属 zeroDateTimeBehavior=convertToNull。

然而,有时候我们并不会直接去呼叫 dbunit:export 这样的 goal,我们会在某个 phase 之后来执行这个 goal,以 dbunit:export 为例,那就要在 pom.xml 中的 dbunit-maven-plugin 插件配置中加上:

<executions> 
    <execution> 
        <phase>process-test-classes</phase> 
        <goals> 
            <goal>operation</goal> 
        </goals> 
        <!-- specific configurations 我们可以在这里指定不同的配置-->
        <configuration> 
            <format>xml</format> 
            <src>src/export.xml</src> 
            <type>CLEAN_INSERT</type> 
        </configuration> 
    </execution> 
</executions>
因为 phase 也是按顺序执行的,这里设置的 goal 是 process-test-classes,所以当我们在执行 mvn process-test-classes 后会调用这个 dbunit:operation goal。而当我们执行 mvn test 时,会发现这个 dbunit:operation 会在 test 之前执行,这能也就能为我们准备好单元测试的数据了,不会因为小动了下数据库而让 test 全线告错。

对于另外两个 goal,dbunit:compare 和 dbunit:export 也可以采用类似的配置,让某个 phase 来调用。

最后,留意下每个 goal 的所有配置以及相应的默认值,比如在执行 dbunit:export 时可以用 <schema> 指定导出哪些表,再严格点可以用
<tables> 
    <table> 
        <name>wp_users</name> 
        <name>wp_posts</name> 
    </table> 
</tables>
指定导出某些特定的表。

    好吧,如果不用这个插件,通过dbunit导出xml可用下面的方法。
protected static void exportAllDatabaseBy() throws ClassNotFoundException, SQLException, DatabaseUnitException, FileNotFoundException, IOException {
Connection conn = getConnection();
IDatabaseConnection connection = new DatabaseConnection(conn);  
        //如果想把某个数据库里的所有表里的数据全部导出到某个xml里,又不想通过addTable一个个来添加的话。则必须通过IDatabaseConnection的createDataSet()来创建IDataSet  
        IDataSet dataSet = connection.createDataSet();  
        //导出到dbunit.xml文件里  
        FlatXmlDataSet.write(dataSet,new FileOutputStream("dbunit.xml"));  
        //也可以用FlatDtdDataSet生成一个对应的dtd文件  
        FlatDtdDataSet.write(dataSet,new FileOutputStream("dbunit.dtd"));
}

protected static void exportDatabaseByTableName()
throws ClassNotFoundException, SQLException, DatabaseUnitException,
AmbiguousTableNameException, IOException, DataSetException,
FileNotFoundException {
Connection conn = getConnection();  
 
IDatabaseConnection connection = new DatabaseConnection(conn);  
QueryDataSet dataSet = new QueryDataSet(connection);  
//将整个person表里的数据导出到 xml文件里  
dataSet.addTable("person");  
//将user表里符合条件的数据导出到xml文件里  
dataSet.addTable("j_user","select * from j_user where id < 4");  
//导出到dbunit.xml文件里  
FlatXmlDataSet.write(dataSet,new FileOutputStream("dbunit.xml"));
FlatDtdDataSet.write(dataSet,new FileOutputStream("dbunit.dtd"));
}
  评论这张
 
阅读(1737)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017