Unitils集成

 

 

集成Spring


Unitils 提供了一些在Spring 框架下进行单元测试的特性。Spring 的一个基本特性就是,类要设计成为没有Spring 容器或者在其他容器下仍然易于进行单元测试。但是很多时候在Spring 容器下进行测试还是非常有用的。

Unitils 提供了以下支持 Spring 的特性:

ApplicationContext 配置的管理;

在单元测试代码中注入Spring 的Beans;

使用定义在Spring 配置文件里的Hibernate SessionFactory;

引用在Spring 配置中Unitils 数据源。

ApplicationContext配置

可以简单地在一个类、方法或者属性上加上@SpringApplicationContext 注解,并用Spring的配置文件作为参数,来加载Spring应用程序上下文。下面我们通过实例来介绍一下如何创建ApplicationContext。

代码清单16 14  加载Spring上下文

 

import org.junit.Test;  
import org.springframework.context.ApplicationContext;  
import org.unitils.UnitilsJUnit4;  
import org.unitils.spring.annotation.SpringApplicationContext;  
import org.unitils.spring.annotation.SpringBean;  
import com.baobaotao.service.UserService;  
import static org.junit.Assert.*;  
//①用户服务测试  
public class UserServiceTest extends UnitilsJUnit4 {  
 
//①-1 加载Spring配置文件  
    @SpringApplicationContext({"baobaotao-service.xml", "baobaotao-dao.xml"})  
    private ApplicationContext applicationContext;  
 
//①-1 加载Spring容器中的Bean  
    @SpringBean("userService")  
    private UserService userService;  
      
//①-3 测试Spring容器中的用户服务Bean  
@Test  
    public void testUserService (){  
        assertNotNull(applicationContext);  
        assertNotNull(userService.findUserByUserName("tom"));  
    }  
}  
 

 

在①-1处,通过@SpringApplicationContext 注解加载baobaotao-service.xml和baobaotaodao.xml两个配置文件,生成一个Spring应用上下文,我们就可以在注解的范围内引用applicationContext这个上下文。在①-2处,通过@SpringBean注解注入当前Spring容器中相应的Bean,如实例中加载ID为"userService"的Bean到当前测试范围。在①-3处,通过JUnit断言验证是否成功加载applicationContext和userService。Unitils加载Spring上下文的过程是:首先扫描父类的@SpringApplicationContext注解,如果找到了就在加载子类的配置文件之前加载父类的配置文件,这样就可以让子类重写配置文件和加载特定配置文件。


细心的读者可能会发现,采用这种方式加载Spring应用上下文,每次执行测试时,都会重复加载Spring应用上下文。Unitils为我们提供在类上加载Spring应用上下文的能力,以避免重复加载的问题。

代码清单16 15  通过基类加载ApplicationContext

 

@SpringApplicationContext({"baobaotao-service.xml", "baobaotao-dao.xml"})  
public class BaseServiceTest extends UnitilsJUnit4 {  
      
 //加载Spring上下文  
    @SpringApplicationContext  
    public ApplicationContext applicationContext;  
 
}  
 

 





集成Hibernate


Hibernate是一个优秀的O / R开源框架,它极大地简化了应用程序的数据访问层开发。虽然我们在使用一个优秀的O/R框架,但并不意味我们无须对数据访问层进行单元测试。单元测试仍然非常重要。它不仅可以确保Hibernate映射类的映射正确性,也可以很便捷地测试HQL查询等语句。Unitils为方便测试 Hibernate,提供了许多实用的工具类,如HibernateUnitils就是其中一个,使用assertMappingWithDatabaseConsistent()方法,就可以方便测试映射文件的正确性。


SessionFactory 配置


可以简单地在一个类、方法或者属性上加上@ HibernateSessionFactory 注解,并用Hibernate的配置文件作为参数,来加载Hibernate上下文。下面我们通过实例来介绍一下如何创建SessionFactory。


代码清单16 17  通过基类加载SessionFactory

@HibernateSessionFactory("hibernate.cfg.xml")  
public class BaseDaoTest extends UnitilsJUnit4 {  
    @HibernateSessionFactory  
    public SessionFactory sessionFactory;  
      
 
    @Test  
    public void testSessionFactory(){  
        assertNotNull(sessionFactory);  
    }  
}

   

在父类BaseDaoTest里指定了Hibernate配置文件,Hibernate应用上下文只会创建一次,然后在子类SimpleUserDaoTest里会重用这个应用程序上下文。加载Hibernate应用上下文是一个非常繁重的操作,如果重用这个Hibernate应用上下文就会大大提升测试的性能。

代码清单16 18  通过继承使用父类的SessionFactory

 

public class SimpleUserDaoTest extends BaseDaoTest {  
    private UserDao userDao;  
 
//① 初始化UserDao  
@Before  
    public void init(){  
         userDao = new WithoutSpringUserDaoImpl();  
        userDao.setSessionFactory(sessionFactory); //使用父类的SessionFactory  
    }  
 
//② Hibernate映射测试  
@Test  
    public void testMappingToDatabase() {  
        HibernateUnitils.assertMappingWithDatabaseConsistent();  
}  
 
//③ 测试UserDao  
    @Test  
    public void testUserDao(){  
        assertNotNull(userDao);  
        assertNotNull(userDao.findUserByUserName("tom"));  
        assertEquals("tom", userDao.findUserByUserName("tom").getUserName());  
    }  
}  
 

 

为了更好演示如何应用Unitils测试基于Hibernate数据访问层,在这个实例中不使用Spring框架。所以在执行测试时,需要先创建相应的数据访问层实例,如实例中的userDao。其创建过程如①处所示,先手工实例化一个UserDao,然后获取父类中创建的SessionFactory,并设置到UserDao中。在②处,使用Unitils提供的工具类HibernateUnitils中的方法测试我们的Hibernate映射文件。在③处,通过JUnit的断言验证 UserDao相关方法,看是否与我们预期的结果一致。




集成Dbunit


Dbunit是一个基于JUnit扩展的数据库测试框架。它提供了大量的类,对数据库相关的操作进行了抽象和封装。Dbunit通过使用用户自定义的数据集以及相关操作使数据库处于一种可知的状态,从而使得测试自动化、可重复和相对独立。虽然不用Dbunit也可以达到这种目的,但是我们必须为此付出代价(编写大量代码、测试及维护)。既然有了这么优秀的开源框架,我们又何必再造轮子。目前其最新的版本是2.4.8。


随着Unitils的出现,将Spring、Hibernate、DbUnit等整合在一起,使得DAO层的单元测试变得非常容易。Unitils采用模块化方式来整合第三方框架,通过实现扩展模块接口org.unitils.core.Module来实现扩展功能。在Unitils中已经实现一个DbUnitModule,很好整合了DbUnit。通过这个扩展模块,就可以在Unitils中使用Dbunit强大的数据集功能,如用于准备数据的@DataSet注解、用于验证数据的@ExpectedDataSet注解。



 

自定义扩展模块


Unitils通过模块化的方式来组织各个功能模块,对外提供一个统一的扩展模块接口org.unitils.core.Module来实现与第三方框架的集成及自定义扩展。在Unitils中已经实现目前一些主流框架的模块扩展,如Spring、Hibernate、DbUnit、Testng等。如果这些内置的扩展模块无法满足需求,我们可以实现自己的一些扩展模块。扩展Unitils模块很简单,如代码清单16-19所示。

代码清单16 19  CustomExtModule

package sample.unitils.module;  
import java.lang.reflect.Method;  
import org.unitils.core.TestListener;  
import org.unitils.core. Module;  
//① 实现Module接口  
public class CustomExtModule implements Module {  
     //② 实现获取测试监听的方法  
    public TestListener getTestListener() {  
        return new CustomExtListener();  
    }  
      
    //② 新建监听模块   
    protected class CustomExtListener extends TestListener {  
         //③ 重写 TestListener里的相关方法,完成相关扩展的功能  
        @Override  
        public void afterTestMethod(Object testObject, Method testMethod,  
                Throwable testThrowable) {  
…  
        }  

        @Override  
        public void beforeTestMethod(Object testObject, Method testMethod) {  
…  
        }  
    }  
…  
}  
 

在①处新建自定义扩展模块CustomExtModule,实现Module接口。在②处新建自定义监听模块,继承TestListener。在③处重写(@Override)TestListener里的相关方法,完成相关扩展的功能。实现自定义扩展模块之后,剩下的工作就是在Unitils配置文件unitils.properties中注册这个自定义扩展的模块:

unitils.modules=…,custom  

unitils.module. custom.className= sample.unitils.module.CustomExtModule 

 



 

遗传算法驱动吃豆人进化:从零构建AI游戏智能体 遗传算法是一种模拟自然选择过程的优化技术,其核心原理是通过选择、交叉和变异等操作,在解空间中迭代搜索最优解。该技术为解决复杂优化问题提供了强大工具,尤其在游戏AI、机器人控制和参数调优等场景中价值显著。在游戏AI领域,遗传算法常被用于训练智能体自主决策,例如在经典游戏《吃豆人》中,通过定义智能体的“基因”(如神经网络权重)和“适应度”(如游戏得分),可以引导其进化出躲避幽灵、高效吃豆等策略。本项目结合Pygame框架与神经网络,构建了一个完整的遗传算法训练沙盒,详细展示了如何通过适应度函数设计和参数调优,实 阅读详情

相关推荐

Python+AI能源管理实战:从电力负荷预测到智能调度的全流程开发

本系统展示了Python在能源管理领域的强大能力,通过AI技术实现了从预测到优化的智能决策闭环。随着碳中和目标的推进,智能能源系统将成为新型电力系统的核心大脑。📌 专业建议:系统部署需考虑网络安全防护,关键控制指令应设置多重验证机制!关注我的优快云账号获取能源系统安全最佳实践~下期预告:我们将探索Python在智慧医疗中的应用,开发基于多模态数据的智能诊断辅助系统。想提前获取代码?评论区留言"智慧医疗"获取GitHub源码链接!

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 625

Unitils集成DBUnit、Spring-单元测试

  Unitils集成DBUnit、Spring-单元测试   1、maven-pom文件中引入相关jar包   <!-- Unitils -dbunit、Spring --> <dependency> <groupId>org.unitils</groupId> &...

weixin_30325793的博客 77

永磁同步电机矢量控制——电流内环前馈解耦策略

在采用永磁同步电机矢量控制时,ud和uq的指令值存在耦合项。需要对其进行解耦,目前,常用的解耦设计方法有前馈解耦、偏差解耦以及内模控制,本文主要分享电流内环前馈解耦控制策略。

a12312341ll的博客 8692

Unitils集成DBUnit的问题-解决方案

Unitils集成DBUnit的问题-解决方案

jcoiwenwfkowe的博客 88

从时序博弈到数据稳定:CS1237驱动中的信号滤波与卡尔曼实践

本文探讨了CS1237高精度ADC驱动在复杂工业环境中的信号处理挑战,重点介绍了一阶滤波与自适应卡尔曼滤波算法的实践应用。通过参数优化和动态调整策略,有效提升了数据稳定性和抗干扰能力,为嵌入式系统在噪声环境下的精密测量提供了可靠解决方案。

rnn9storyteller的博客 863

SKF SimPro Quick 4.8.1发布

发布说明可以在SimPro手册的SKF SimPro Quick应用程序的一般部分下找到(帮助→SKF SimPro快速手册→一般→发布说明)。请删除旧版本,请备份您存储在C:\SKF SimPro xxx\files文件夹中的文件以及所有自定义报告模板和表格。我们很高兴地通知您,我们的轴承应用工程软件SKF SimPro Quick 4.8.1可供下载。将新的安装文件下载到本地计算机后,双击它安装向导将打开(按照说明操作)3.安装后,在本地机器上启动SKF SimPro Expert软件。

小韩的博客 1818

dbunit mysql bug no_Unitils集成DBUnit、Spring-单元测试

Unitils集成DBUnit、Spring-单元测试1、maven-pom文件中引入相关jar包org.unitilsunitils-dbunit3.4.2org.unitilsunitils-io3.4.2org.unitilsunitils-database3.4.2org.unitilsunitils-spring3.4.2以上Unitils集成dbunit、Spring所必须jar包,工...

weixin_39859220的博客 186

从零搭建SPI通信系统:AXI Quad SPI IP核在Xilinx平台上的完整配置流程

本文详细介绍了在Xilinx平台上使用AXI Quad SPI IP核从零搭建SPI通信系统的完整配置流程。涵盖IP核架构解析、Vivado环境配置、寄存器编程实战及性能优化策略,帮助开发者快速实现高速稳定的SPI通信,特别适用于嵌入式系统开发中的外围设备连接需求。

hh234的博客 1053

Unitils 使用指南[翻译]-和Spring的集成

  1.1.1           和Spring的集成   Unitils 也提供了对Spring框架的支持。Sping的一个基本远侧就是你的对象应该被设计成容易测试的,即使没有Spring或者其他容器。There are times however, when it can be useful to work with object structures that ...

软件生产流程和软件人员心理的思考-Alfred 187

如何在SendWS实现WhatsApp批量群发设置管理?WhatsApp群发超链有什么好处?

WhatsApp群发顾名思义就是对WhatsApp上的用户好友进行群发消息,给他们群发想要发送的消息。及时不认识对方也可以对他进行群发超链。越来越多做跨境出海运营的工作者利用WhatsApp进行营销推广,因为他能做到低成本高回报,向客户发送消息曝光自己的品牌或产品,使得更多人了解,拓展新客户,提高成交率。

SendWS-WS云控群控拓客聊天翻译 1169

MDF和DHF、DMR、DHR三者差异?注册与备案文件?医疗器械产品技术要求编写指导原则

定义:设计历史文档(DHF ) 指的是描述某医疗器械成品设计过程的有关记录。内容:DHF包括设计开发活动的所有记录。从最初的策划、客户需求、设计输入,设计输出、设计验证、设计确认、所有的设计评审,设计转换,以及设计变更相关的所有记录。均属于DHF的一部分。要求:各制造商应为每个类型的器械建立并保持设计历史文件。设计历史文件应包含或引用必要的记录,以证实设计符合经批准的设计计划和法规的要求。

学海无涯的专栏 9110

TMS320F280049C点灯例程详解:从系统时钟到GPIO初始化

在嵌入式开发中,点亮一颗LED常被视为入门的第一步,但背后却串联着处理器启动流程、系统时钟配置、PLL倍频以及GPIO复用与方向控制等一系列基础而关键的环节。对于C2000系列DSP而言,系统时钟(SYSCLK)由内部振荡器经PLL倍频与分频得到,它决定了CPU和外设的时序基准;而GPIO引脚需要显式配置复用功能与输入输出方向,才能真正输出预期的电平信号。理解这些原理,不仅有助于快速定位延时异常、程序跑飞、引脚无响应等工程问题,也是后续开发PWM、ADC、通信接口等复杂外设的能力基础。本文以TMS320F2

weixin_33835103的博客 345

哨兵1号后向散射系数土壤水分反演

打开之前预处理之后的VH和VV极化的后向散射系数转存的tiff文件。

所有专家都曾始于新手 3293

Unitils集成DBUnit、Spring-单元测试(转)

1、maven-pom文件中引入相关jar包   <!-- Unitils -dbunit、Spring --> <dependency> <groupId>org.unitils</groupId> <artifactId>unitils-dbunit&lt...

weixin_30352645的博客 118

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【让开发自动化】Unitils集成Feed4junit

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34072857的博客 261

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

dbunit mysql_unitils集成dbunit与MySQL的NoSuchColumnException问题

org.unitils.core.UnitilsException: Error inserting test data from DbUnit dataset for method public void com.smart.dao.UserDaoTest.findUserByUserName()at org.unitils.dbunit.DbUnitModule.insertDataSet(D...

weixin_35698069的博客 426

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

[Unitils]初识Unitils

http://www.unitils.org/summary.html# Summary Unitils is an open source library aimed at making unit and integration testing easy and maintainable. It is divided into several modules, each of th...

自娱《测试开发》专栏 163

单元测试三叉戟—JUNIT,DBUNIT,UNITILS

在Java单元测试领域,JUNIT一直各位开发人员和测试人员的最佳选择,它不仅提供了很多标准的API,同时很多IDE也对它提供了运行环境支持。特别是JUNIT4以后,引入了Java annotation的方式,进一步规范了测试脚本的结构,使测试脚本在原有的框架下更加灵活。DBUNIT是一款基于JAVA的数据库维护工具,让在单元测试中使数据库中的数据维护透明化成为可能。UNITILS是一

phphot 3037

unitils 测试框架介绍(一)

Junit 是用于自动化测试Java代码的框架,而Unitils是测试整合之王,目的是 让单元测试更加容易和可维护,Unitils构建在DbUnit与EasyMock 项目之上并与JUnit和TestNG相结合,支持数据库测试,支持利用Mock对象进行测试并提供与Spring和Hibernate相集成。Unitils模块组件有一下组成: 1、unitils-core: 核心内核包 2、unitils-dat...

lgxzzz的博客 587
上一篇: Unitils概述
下一篇: Linux 系统命令及其使用详解
gufengjava
博客等级 码龄16年 1粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值