Unitils集成DBUnit、Spring-单元测试

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:   Unitils集成DBUnit、Spring-单元测试   1、maven-pom文件中引入相关jar包   org.unitils unitils-dbunit 3.

  Unitils集成DBUnit、Spring-单元测试

  1、maven-pom文件中引入相关jar包  

复制代码
<!-- Unitils -dbunit、Spring -->
        <dependency>
            <groupId>org.unitils</groupId>
            <artifactId>unitils-dbunit</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.unitils</groupId>
            <artifactId>unitils-io</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.unitils</groupId>
            <artifactId>unitils-database</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.unitils</groupId>
            <artifactId>unitils-spring</artifactId>
            <version>3.4.2</version>
        </dependency>
复制代码

  以上Unitils集成dbunit、Spring所必须jar包,工程文件是通过maven构建的,所以都是maven的目录结构。

  2、引入unitils的配置文件unitils.properties,这个配置文件可以用unitils-core的jar包中copy出来,然后进行自定义配置,如下:

复制代码
#启用unitils所需模块
unitils.modules=database,dbunit,spring

#自定义扩展模块,详见实例源码
#unitils.module.dbunit.className=org.unitils.dbunit.DbUnitModule
unitils.module.dbunit.className=com.candle.util.MySqlDbUnitModule

#配置数据库连接
database.driverClassName=com.mysql.jdbc.Driver
database.url=jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf-8
database.userName=root
database.password=123qwe
#配置为数据库名称
database.schemaNames=test
#配置数据库方言
database.dialect=mysql

#配置数据库维护策略.请注意下面这段描述
# If set to true, the DBMaintainer will be used to update the unit test database schema. This is done once for each
# test run, when creating the DataSource that provides access to the unit test database. updateDataBaseSchema.enabled=false #配置数据库表创建策略,是否自动建表以及建表sql脚本存放目录 #dbMaintainer.autoCreateExecutedScriptsTable=false #dbMaintainer.script.locations=D:\workspace\unit-demo\src\test\java\com\candle\dao #数据集加载策略 #CleanInsertLoadStrategy:先删除dateSet中有关表的数据,然后再插入数据 #InsertLoadStrategy:只插入数据 #RefreshLoadStrategy:有同样key的数据更新,没有的插入 #UpdateLoadStrategy:有同样key的数据更新,没有的不做任何操作 DbUnitModule.DataSet.loadStrategy.default=org.unitils.dbunit.datasetloadstrategy.impl.CleanInsertLoadStrategy #配置数据集工厂 DbUnitModule.DataSet.factory.default=org.unitils.dbunit.datasetfactory.impl.MultiSchemaXmlDataSetFactory DbUnitModule.ExpectedDataSet.factory.default=org.unitils.dbunit.datasetfactory.impl.MultiSchemaXmlDataSetFactory #配置事务策略 commit、rollback 和disabled;或者在代码的方法上标记@Transactional(value=TransactionMode.ROLLBACK) #commit 是单元测试方法过后提交事务 #rollback 是回滚事务 #disabled 是没有事务,默认情况下,事务管理是disabled DatabaseModule.Transactional.value.default=disabled #配置数据集结构模式XSD生成路径,可以自定义目录,但不能为空 dataSetStructureGenerator.xsd.dirName=/ dbMaintainer.generateDataSetStructure.enabled=true
复制代码

  自定义配置文件有两个,分别是unitils.properties和unitils-local.properties,但通常我们只需要配置unitils.properties即可,这个配置文件默认是放在工程的根目录下,我这里的测试

根目录是/src/test/resources/下。因为unitils默认是这样去读取配置文件的,所以不建议移动到其他目目录,不然可能需要更改读取配置文件的代码了。

  3、写一个mysql数据库配置的类,用于解决dbunit中存在的bug,在上一篇博客中有讲到,代码如下  

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

  加如上类之后,再去看unitils.properties中  

#自定义扩展模块,详见实例源码
#unitils.module.dbunit.className=org.unitils.dbunit.DbUnitModule
unitils.module.dbunit.className=com.candle.util.MySqlDbUnitModule          
如上就制定到自定义的类com.candle.util.MySqlDbUnitModule,解决dbunit中可能存在的bug

4、准备测试数据
@DataSet和@ExpectedDataSet
这里都用xml来存放数据,如果要用excel,需要重写excel获取数据的相关代码
xml存放路径如下:src/test/resources/dataSetXml/,目录下包括@DataSet数据(login.xml)和@ExpectedDataSet数据login_expect.xml

5、测试代码
复制代码
package com.candle.dao;

import static org.junit.Assert.*;

import org.junit.Test;
import org.unitils.UnitilsJUnit4;
import org.unitils.database.annotations.Transactional;
import org.unitils.database.util.TransactionMode;
import org.unitils.dbunit.annotation.DataSet;
import org.unitils.dbunit.annotation.ExpectedDataSet;
import org.unitils.reflectionassert.ReflectionAssert;
import org.unitils.spring.annotation.SpringApplicationContext;
import org.unitils.spring.annotation.SpringBean;

import com.candle.model.LoginDO;

@SpringApplicationContext({"applicationContext-test.xml"})
public class LoginDAOTest5 extends UnitilsJUnit4{
    
    //Spring容器中加载Id为"userService"的Bean
    @SpringBean("loginDAO")
    private LoginDAO loginDAO ;

    
    @Test
    @ExpectedDataSet("/dataSetXml/login_expect.xml")
    public void testSaveLogin() {
        LoginDO loginDo = new LoginDO();
        loginDo.setId(2);
        loginDo.setName("thomas");
        loginDo.setPasswd("123qwe");
        loginDAO.saveLogin(loginDo);
    }

    
    @Test
    @DataSet("/dataSetXml/login.xml")
    //@Transactional(value=TransactionMode.ROLLBACK)
    public void testFindById() {
        LoginDO loginDo = loginDAO.findById(1) ;
        ReflectionAssert.assertPropertyLenientEquals("name","candle",loginDo) ;
        assertNotNull("空置", loginDo);
        assertEquals("candle",loginDo.getName()) ;
    }
    
}
复制代码

  其中,关于unitils集成spring,就是通过集成UnitilsJUnit4类引入spring的配置文件,即可完成Spring的bean之类的重用~

  6、回滚问题

  通过以上配置,包括事务配置,通过测试发现,unitils的事务是集成自Spring的,所以如果当测试类中集成了Spring的applicationContext配置文件,则unitils中的事务配置无效,这里测试过回滚事务,

  DatabaseModule.Transactional.value.default=rollback,在测试中引用Spring的配置时,此回滚无效,如果不引用Spring的配置,则可以生效~

  此问题有待研究~

  

 

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
安全
/etc/security/cacerts 只读权限
/etc/security/cacerts 只读权限
600 0
|
人工智能 C++ iOS开发
ollama + qwen2.5-coder + VS Code + Continue 实现本地AI 辅助写代码
本文介绍在Apple M4 MacOS环境下搭建Ollama和qwen2.5-coder模型的过程。首先通过官网或Brew安装Ollama,然后下载qwen2.5-coder模型,可通过终端命令`ollama run qwen2.5-coder`启动模型进行测试。最后,在VS Code中安装Continue插件,并配置qwen2.5-coder模型用于代码开发辅助。
20053 71
|
10月前
|
监控 网络安全 开发者
Python中的Paramiko与FTP文件夹及文件检测技巧
通过使用 Paramiko 和 FTP 库,开发者可以方便地检测远程服务器上的文件和文件夹是否存在。Paramiko 提供了通过 SSH 协议进行远程文件管理的能力,而 `ftplib` 则提供了通过 FTP 协议进行文件传输和管理的功能。通过理解和应用这些工具,您可以更加高效地管理和监控远程服务器上的文件系统。
355 20
|
Linux Perl
Linux awk命令使用技巧
【10月更文挑战第16天】Linux awk命令使用技巧
293 4
|
存储 druid Java
Springboot+Druid动态切换数据源
关于数据源的切换,在实际使用中经常出现,本文主要是使用Druid,最近经常使用到,根据以往项目的使用,调整后进行记录,方便自己以后查看,也便于大家一起学习
2047 0
|
存储 运维 监控
在Linux中,在分布式环境中如何实现文件系统冗余和同步?(例如DRBD、GlusterFS)
在Linux中,在分布式环境中如何实现文件系统冗余和同步?(例如DRBD、GlusterFS)
|
NoSQL Ubuntu Linux
【操作系统】实验三 编译 Linux 内核
【操作系统】实验三 编译 Linux 内核
574 1
|
存储 Kubernetes 安全
加密 K8s Secrets 的几种方案
加密 K8s Secrets 的几种方案
|
Go Java
mockito中两种部分mock的实现,spy、callRealMethod
什么是类的部分mock(partial mock)?A:部分mock是说一个类的方法有些是实际调用,有些是使用mockito的stubbing(桩实现)。   为什么需要部分mock? A:当需要测试一个组合方法(一个方法需要其它多个方法协作)的时候,某个叶子方法(只供别人调用,自己不依赖其它反复)已经被测试过,我们其实不需要再次测试这个叶子方法,so,让叶子打桩实现返回结果,上层方法实际调用并测试。
4870 1