`
zhaohaolin
  • 浏览: 1026174 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

用Spring提供的JUnit框架扩展对DAO或Service层进行单元测试

    博客分类:
  • JAVA
阅读更多

用Spring提供的JUnit框架扩展对DAO或Service层进行单元测试

单元测试及其背后的组件易测性是贯穿Spring应用的核心理念之一。一直以来,与测试独立的Java对象相比,由于J2EE Web组件必须运行于某种容器,或者还要与基于HTTP的Web环境交互,所以测试它们是一项艰巨而复杂的任务。

Spring Mock包提供了一些扩展自JUnit框架的测试基类,这些基类简化了对依赖注射和事务管理的单元测试。

下面的内容来自csdn的一篇文章,算是helloworld教程吧。

 

一、Spring提供的JUnit框架扩展:

AbstractSpringContextTests :spring中使用spring上下文测试的Junit扩展类,我们一般不会使用这个类来进行单元测试,它是spring内部设计使用到的类

AbstractDependencyInjectionSpringContextTests :这是AbstractSpringContextTests的直接子类,支持依赖spring上下文的测试类,这个类不支持事务。

AbstractTransactionalSpringContextTests : 这是AbstractDependencyInjectionSpringContextTests的直接子类,这个类一般应用在事务相关的测试中,一旦 完成每个测试它就会正常地回滚事务,不会真正更新数据库,若要手动设置事务相关操作,你可以重载onSetUpInTransaction和 onTearDownInTransaction方法,以便手工开始并提交事务,或者调用setComplete()方法。这个类也可以在没有事务的情况 下,使用这个类。
AbstractTransactionalDataSourceSpringContextTests:这是 AbstractTransactionalSpringContextTests的直接子类,它使用了Spring的基于JDBC的 jdbcTemplate工具类,支持数据库级别的事务。

二、如何在你的TestCase Class里取得spring context

     你的TestCase Class必须继承的是上述四个AbstractXXXSpringContextTests中的其中一个,那么就必须实现下面这个方法来取得spring context:

      protected abstract String[] getConfigLocations();

      例如:

      public String[] getConfigLocations() {
           String[] configLocations = { "applicationContext.xml","hibernate-context.xml" };
           return configLocations;
       }

请 注意要加载的context xml file的路径问题:上述的代码是基于classpath,因此applicationContext.xml和hibernate- context.xml必须放在classpath里(方法一是把xml files放到WEB-INF/classes目录下,另一种方法就是在project properties里把xml files的路径加到classpath里)

那么如果你一定要把context xml files放到WEB-INF目录下,也是可以的,那么应该基于file(基于file的相对路径是相对于project root folder),代码如下:

public
 String[] getConfigLocations() {

<!--CRLF-->

   String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml"
};

<!--CRLF-->

   return
 configLocations;

<!--CRLF-->

} 

<!--CRLF-->

AbstractXXXSpringContextTests就会根据根据getConfigLocations方法返回的context xml位置的数组来加载并且对加载的Context提供缓存。这是非常重要的,因为如果你在从事一个大项目时,启动时间可能成为一个问题--这不是 Spring自身的开销,而是被Spring容器实例化的对象在实例 化自身时所需要的时间。例如,一个包括50-100个Hibernate映射文件的项目可能需要10-20秒的时间来加载上述的映射文件,如果在运行每个 测试fixture里的每个测试案例前都有这样的开销,将导致整个测试工作的延时,最终有可能(实际上很可能)降低效率。

在某种极偶然的情况下,某个测试可能“弄脏”了配置场所,并要求重新加载--例如改变一个bean的定义或者一个应用对象的状态--你可以调用 AbstractDependencyInjectionSpringContextTests 上的 setDirty() 方法来重新加载配置并在执行下一个测试案例前重建application context

当类 AbstractDependencyInjectionSpringContextTests(及其子类)装载你的Application Context时,你可以通过Setter方法来注入你想要的来自context的bean,而不需要显式的调用 applicationContext.getBean(XXX)。因为 AbstractDependencyInjectionSpringContextTests会从getConfigLocations()方法指定的 配置文件中帮你自动注入

下面的例子就是通过setter方法来获得context里的ProductManager bean:

public
 class
 MyTest extends
 AbstractDependencyInjectionSpringContextTests {

<!--CRLF-->

    ProductManager productManager; 

<!--CRLF-->

 

<!--CRLF-->

    public
 String[] getConfigLocations() {

<!--CRLF-->

        String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml"
 };

<!--CRLF-->

        return
 configLocations;

<!--CRLF-->

    } 

<!--CRLF-->

 

<!--CRLF-->

    public
 void
 testGetProduct() {

<!--CRLF-->

       assertEquals("tomson"
,productManager.getProductByName("tomson"
).getName());

<!--CRLF-->

    }

<!--CRLF-->

 

<!--CRLF-->

    //通过setter方法自动从context里注入productManager bean,而不用显示调用applicationContext.getBean(XXX)

<!--CRLF-->

    public
 void
 setProductManager(ProductManager productManager) {

<!--CRLF-->

       this
.productManager = productManager;

<!--CRLF-->

    }

<!--CRLF-->

} 

<!--CRLF-->

 

<!--CRLF-->

但是如 果context里有多个bean都定义为一个类型(例如有多个bean都是ProductManager class类型的),那么对这些bean就无法通过setter方法来自动依赖注入(因为有多个bean同一个类型,不知要自动注入哪个)。在这种情况下 你需要显示的调用applicationContext.getBean(XXX)来注入。如:

public
 class
 MyTest extends
 AbstractDependencyInjectionSpringContextTests {

<!--CRLF-->

   ProductManager productManager; 

<!--CRLF-->

 

<!--CRLF-->

   public
 String[] getConfigLocations() {

<!--CRLF-->

      String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml"
 };

<!--CRLF-->

      return
 configLocations;

<!--CRLF-->

   } 

<!--CRLF-->

 

<!--CRLF-->

   public
 void
 onSetUp() {

<!--CRLF-->

       productManager = (ProductManager) applicationContext.getBean("productManager"
);

<!--CRLF-->

   } 

<!--CRLF-->

 

<!--CRLF-->

   public
 void
 testGetProduct() {

<!--CRLF-->

       assertEquals("tomson"
,productManager.getProductByName("tomson"
).getName());

<!--CRLF-->

   }

<!--CRLF-->

} 

<!--CRLF-->

 

<!--CRLF-->

如果你的TestCase不使用依赖注入,只要不定义任何setters方法即可。或者你可以继承 AbstractSpringContextTests --这个 org.springframework.test 包中的根类,而不是继承AbstractDependencyInjectionSpringContextTests(及其子类)。这是因为 AbstractSpringContextTests 只包括用来加载Spring Context的便利方法但没有自动依赖注入的功能。

分享到:
评论

相关推荐

    系统管理 - PowerShell-7.5.0-win-x64.exe离线安装包 - 兼容Win10/Win11的跨平台运维解决方案

    1.【内容概要】 微软官方原版PowerShell 7.5.0 x64离线安装包,集成「三件套」企业级解决方案: [1.1] 智能环境配置脚本(自动修复.NET 6依赖/注册表权限); [1.2] 运维增强组件包(SSH远程管理+日志审计模块); [1.3] 跨平台脚本兼容方案(支持Linux/Windows混合执行); 2.【适用人群】 [2.1] 运维工程师:需批量管理Windows Server集群; [2.2] ​全栈开发者:构建CI/CD自动化流水线; ​ [2.3] 系统管理员:解决PowerShell 5.1模块兼容性问题; [2.4] ​IT培训机构:教学环境快速统一部署; 3.【使用场景】 [3.1] 企业内网部署,离线安装+环境自动初始化,内置AutoDeploy.cmd脚本。 [3.2] 跨平台脚本开发,同时操作Linux/Windows设备,集成OpenSSH Client 8.6。 [3.3] 高危操作防护,防止误执行危险命令,内置SafeMode沙箱模块。 4. 【使用目标】快速

    AUTOSAR以太网状态管理器(EthSM)解析:通信架构、状态机与应用实例

    内容概要:本文深入探讨了AUTOSAR以太网状态管理器(EthSM),涵盖其在AUTOSAR分层架构中的位置、主要职责、架构设计、接口定义及依赖关系,并详述状态机的具体状态、转换规则与事件处理流程。同时提供了详细的通信序列图解,帮助理解初始化及启动闭合通信等关键过程,并介绍了配置参数设置和错误处理方式。 适合人群:具备嵌入式系统或汽车电子背景的研发人员和技术管理人员。 使用场景及目标:适用于理解和设计复杂的车内以太网通信系统,尤其是基于AUTOSAR平台的开发项目。帮助技术人员掌握以太网状态的管理和故障排查方法,提高车载通信系统的可靠性。 阅读建议:由于内容专业性较强,建议读者对AUTOSAR基础知识有一定了解后再行阅读,在实践中逐步掌握各个概念和知识点的应用技巧,特别注意状态切换的实际案例分析。

    特易通国产对讲机TH-UVF9D v1.0中英写频软件

    特易通国产对讲机TH-UVF9D v1.0中英写频软件

    数据库_多线程_结构文档_生成工具_1741868776.zip

    数据结构学习

    信息资源整合及应用服务平台的需求规格说明书-系统架构与功能实现详解

    内容概要:该文档是一份关于‘信息资源整合及应用服务平台’需求规格说明书的详尽描述,涵盖项目的总体介绍、业务分析、系统需求、功能模块需求和部署环境等多个方面。文中明确了项目目标是对异构信息资源进行全面整合,并提供了详细的架构设计,确保用户在统一平台上享受高效的资源配置和服务体验。此外还介绍了平台的关键技术工具如TRSWCM和HyBase的使用,及各子系统间协作流程,强调了信息收集渠道多样化及其智能化管理水平。 适用人群:面向项目建设方(即负责系统建设和部署的组织或团队),相关用户和技术人员。 使用场景及目标:为建设‘信息资源整合及应用服务平台’提供建设指导和功能需求分析,明确项目范围、质量标准及开发任务分工;同时有助于相关人员更好地理解该平台的工作机制和应用场景。其他说明:此需求说明书亦可用于指导平台未来的维护和技术升级工作。 其他说明: 包含对系统管理、登录管理、日志管理等多个模块的详细说明,并对每个模块的功能进行了细致划分与介绍。文档末尾附带需求跟踪矩阵,用来监测各个阶段的任务完成情况和进度管理。

    java-springboot+vue家居日用小百货交易网站实现源码(项目源码-说明文档).zip

    系统基于Spring Boot+Vue.js的B/S架构,采用RESTful API实现前后端解耦,MySQL数据库配合MyBatis-Plus ORM框架构建高性能数据层。通过Spring Boot模块化设计、Vuex状态管理及Element UI组件库,实现开发效率与可维护性双提升,结合数据库索引优化与读写分离机制,保障系统高并发处理能力与扩展性。

    数据结构_算法库_句芒_Morn高效通用处理用途_1741872053.zip

    数据结构学习

    hello-java-maker_JavaInterview_1741864831.zip

    操作系统学习

    算法_数据结构_慕课网_学习代码库_CPP实现用途_1741873499.zip

    数据结构学习

    特易通国产对讲机TH-UV8000D v1.0中英写频软件

    特易通国产对讲机TH-UV8000D v1.0中英写频软件

    数字化为企业节能降碳提供新动能【22页】.pptx

    数字化为企业节能降碳提供新动能【22页】

    动物园异常现象解析:基于游客与员工守则揭示神秘逃脱规则

    内容概要:本文以某动物园的游客守则、员工守则以及海洋馆的特殊告示为主要框架,呈现了一个充满恐怖与诡异色彩的独特故事。故事围绕游客和员工的行为规范展开,通过种种奇怪的规定,揭示了一个超现实的环境,暗示存在某种未知实体'它’的操控或威胁,其中涉及到了诸如幻视、认知错乱等多种异象,并以‘唯一解’的形式设置了谜题等待解答,整个文本充斥着紧张悬疑氛围。 适用人群:适合喜爱恐怖悬疑风格作品的成人读者,尤其是对超自然题材感兴趣的文学爱好者。 使用场景及目标:①营造神秘惊悚感的故事叙述背景,探讨人性与现实感知之间的复杂关系;②提供解谜元素激发思考,吸引受众深入探究背后的真相。目标在于带给人们非同寻常的心理体验的同时,引导他们探索表象背后隐藏的意义,从而更好地理解作者构建这个世界观的核心意图所在。 其他说明:本文不仅是一份简单的守则指南,更是一场沉浸式的心理游戏,通过对细节的精心编排来增强故事的真实性和代入感。同时,文中提及多个关于兔子、白狮子、山羊等角色的信息交织形成了复杂的情节脉络,进一步增加了叙事深度。然而值得注意的是,尽管文章看似提供了逃生指引,但实际上并未给出明确的结局指向,使得每位读者都能根据自己对文本的理解得出不同的答案,这也是此类作品魅力之一。

    基于C语言+STM32开发的人体健康监测装置(检测温度与心率判断健康状态)+源码(毕业设计&课程设计&项目开发)

    基于C语言+STM32开发的人体健康监测装置(检测温度与心率判断健康状态)+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 检测当前的温度与心率,同时通过MPU6050检测老人是否摔倒 将摔倒信息发送给子女 基于C语言+STM32开发的人体健康监测装置(检测温度与心率判断健康状态)+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 检测当前的温度与心率,同时通过MPU6050检测老人是否摔倒 将摔倒信息发送给子女 基于C语言+STM32开发的人体健康监测装置(检测温度与心率判断健康状态)+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 检测当前的温度与心率,同时通过MPU6050检测老人是否摔倒 将摔倒信息发送给子女~

    机器学习入门(线性回归)波士顿房价预测代码

    机器学习入门(线性回归)波士顿房价预测代码

    特易通国产对讲机MD580 v1.0中英写频软件

    特易通国产对讲机MD580 v1.0中英写频软件

    后端开发_Go语言_面试题_学习资源_1741867880.zip

    数据结构学习

    2025年美赛全流程指南

    2025年美赛全流程指南

    数据结构_算法可视化_Unity_教育演示系统_1741873797.zip

    数据结构学习

    嵌入式系统下栈与队列方案的选择以及C语言实现

    内容概要:本文详细探讨了栈和队列这两种重要的线性数据结构在嵌入式系统中的C语言实现。首先介绍了栈和队列的基本概念及其存储结构,并结合实际应用场景讲解了这两种结构的操作实现方法。文章还针对嵌入式系统资源受限的特点对比了顺序栈、链栈、循环队列和链队列这四种常见形式的优点与缺点,重点讨论了在不同情况下哪种实现更适合。具体实现部分提供了详细的代码样例,并强调了性能优化策略,比如通过位运算加速取余操作,从而使得程序不仅符合理论标准还能高效地运行在特定硬件环境之中。 适合人群:嵌入式系统开发者和技术爱好者,尤其是希望深入理解栈与队列原理及其在嵌入式环境下优化策略的人士。 使用场景及目标:该文档可以帮助读者掌握如何基于不同的项目要求(如是否能预估最大容量或存在大量不定长数据等)来决定最适合的具体实现,同时通过动手编写和调试提供的示例代码加深理解栈与队列的工作机制及其在嵌入式编程中的应用场景。 其他说明:除了基础的栈和队列知识,本文件还将带领读者探索更深层次的主题,如内存管理、指针操纵及高效编码技巧等方面的内容。

    汽车电子领域的 AUTOSAR COM Based Transformer 架构分析及其实现细节

    内容概要:这篇文档深入剖析了 AUTOSAR 规范中重要的 COM Based Transformer 组件。首先对 COM Based Transformer 进行简述,并对其架构做了宏观概述;随后从配置层面详细解释它的结构和类之间的相互关系,并对它所涉及的重要类进行了逐项阐述;接着对内部构成、各部分功能以及外部接口做了细致入微的研究,尤其是针对其初始化机制、序列化能力及其反向工作的机理方面展开讨论;最后还展示了其具体操作过程以及状态变化情况,为理解和实施该模块提供了详实的支持。 适合人群:对于从事车载网络通信系统的开发者或研究人员来说非常有价值。 使用场景及目标:旨在帮助工程师们快速掌握 COM Based Transformer 在 AUTOSAR 平台下是如何运作的,进而提升他们构建高性能车载应用程序的能力。 阅读建议:为了能充分理解这篇技术报告的价值,强烈建议那些已经熟悉基本 AUTOSAR 结构的专业技术人员阅读此文。此外,在实际工程项目当中遇到有关此主题的问题之时可以随时查阅文中提到的概念和技术点来寻求解决方法。由于文中涉及到很多具体的接口和参数设定,请在实际开发过程中仔

Global site tag (gtag.js) - Google Analytics