Spring应用的单元测试

简介:
8.3 Spring应用的单元测试
       8.3.1单元测试现在越来越被广泛重视起来,而Spring更是将时下比较流行的Junit开元测试框架进行整合下面我简单的介绍一下在Sping中该如何对代码进行单元测试(本节会认为读者已经具备了Junit基础方面的知识)。按照Spring的推荐,在单元测试时不应该依赖于Spring容器,也就是说不应该在单元测试是启动ApplicationContext并从中获取Bean,相反应该通过模拟对象完成单元测试。而Spring就提供了这样一个类供大家继承。下面来看看示例代码:
       1)自动装配的测试用例
代码清单1
import  org.springframework.beans.factory.annotation.Autowired;
import  org.springframework.stereotype.Service;
import  com.tony.web.dao.FooDao;
 
@Service
public   class  FooService {
     @Autowired
     private  FooDao  dao ;
     public  String save(String name){
        if (name ==  null  ||  "" .equals(name))
            throw   new  RuntimeException( "Name is null" );
        return   dao .save(name);
    }
}
import  org.springframework.stereotype.Repository;
@Repository
public   class  FooDao {
     public  String save(String name){
        return   "success" ;
    }
}
import  org.springframework.test.
AbstractDependencyInjectionSpringContextTests;
import  com.tony.web.service.FooService;
public   class  MyTest  extends  AbstractDependencyInjectionSpringContextTests{
     protected  FooService  fooService ;
     //set 方法
     public   void  setFooService(FooService fooService) {
        this . fooService  = fooService;
    }
     // 指定 Spring 配置文件的位置
     protected  String[] getConfigLocations(){
        return   new  String[]{ "spring-config-beans.xml" };
    }
     // 测试方法
     public   void  testSave(){
       String str =  this . fooService .save( "Tony" );
       System. out .print(str);
       assertEquals( "success" , str);
    }
}
<? xml  version = "1.0"  encoding = "UTF-8" ?>
< beans  xmlns = "http://... >
     < context:component-scan  base-package = "com.tony" />
</ beans >
代码清单 1 中定义了 FooService.java FooDao.java 两个 Bean 已经使用  @Autowired 进行了装配,我们的单元测试类 MyTest 继承了
AbstractDependencyInjectionSpringContextTests 类,配置好 fooService set 方法并且指定 Spring 配置文件的位置后,当测试用例运行时我们需要的 fooService 会自动注入进来,我们只要在 testSave 方法中直接使用就可以了,还有两外一种写法
代码清单 2
public   class  MyTest  extends  AbstractDependencyInjectionSpringContextTests{
     protected  FooService  fooService ;
   
     public  MyTest(){
        // 启用直接对属性变量进行注入的机制
this .setPopulateProtectedVariables( true );
    }
     protected  String[] getConfigLocations(){
        return   new  String[]{ "spring-config-beans.xml" };
    }
     public   void  testSave(){
       String str =  this . fooService .save( "Tony" );
       System. out .print(str);
       assertEquals( "success" , str);
    }
}
代码清单 2 中我们移除了 set 方法,增加了一个构造函数,在构造函数中调用父类的方法启用直接对属性变量进行注入的机制。有时我们测试的时候会操作数据库插入一条记录,由于我们不会每次都修改测试的数据,当我们再次插入同样的数据时数据库肯定会要报错了,此时我们需要既能测试又能不让测试的数据在数据库中起作用, Spring 就知道我们的这个需要,为我们准备了 AbstractTransactionalSpringContextTests 这个类。
代码清单 3
import  org.springframework.test.
AbstractTransactionalSpringContextTests;
import  com.tony.web.service.FooService;
public   class  MyTest  extends  AbstractTransactionalSpringContextTests{
     protected  FooService  fooService ;
     public  MyTest(){
        this .setPopulateProtectedVariables( true );
    }
     protected  String[] getConfigLocations(){
        return   new  String[]{ "spring-config-beans.xml" };
    }
// 测试方法中的数据操作将在方法返回前被回滚 , 不会对数据库产生永久性数据操作 , 下一 // 次运行该测试方法时 , 依旧可以成功运行 .
     public   void  testSave(){
       String str =  this . fooService .save( "Tony" );
       System. out .print(str);
       assertEquals( "success" , str);
    }
}
     这样就可以在方法返回之前将测试数据回滚,以保证下次单元测试的成功。









本文转自 tony_action 51CTO博客,原文链接:http://blog.51cto.com/tonyaction/84178,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
293 3
|
1月前
|
机器学习/深度学习 自然语言处理 API
query改写:大模型应用测试离不开的实践
queryrewrite 是一个用于大模型应用测试的 Python 库,专注于查询(query)的改写与验证。它支持多种改写方法,包括大型语言模型(LLM)、词汇表替换和同义词替换,同时提供多种验证方法如 ROUGE-L、BLEU、帕累托最优和LLM语义相似度,以确保改写后的查询在语义上保持一致。该项目特别优化了对中文文本的处理,涵盖分词和相似度计算。用户可通过 pip 安装,并支持扩展不同的 LLM 模型,如 OpenAI、Ollama 等。
334 87
query改写:大模型应用测试离不开的实践
|
1月前
|
JSON 自然语言处理 算法
大模型应用测试必备技能:问题对生成实践
本文介绍了利用LangChain的QAGenerationChain从文本生成问题-答案对(QA pairs)的方法,旨在解决LLM应用开发中测试数据生成的格式不统一、库版本过时、模型输出异常及代码可维护性差等问题。文中提供了完整的代码实现,并对生成结果进行了有效性评估,包括语义相似度检查、关键词匹配和重复性检测,确保生成的QA对质量可靠,适用于知识库测试与评估。
253 86
|
3月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
415 0
|
26天前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
1月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
559 10
|
2月前
|
安全 Java Nacos
0代码改动实现Spring应用数据库帐密自动轮转
Nacos作为国内被广泛使用的配置中心,已经成为应用侧的基础设施产品,近年来安全问题被更多关注,这是中国国内软件行业逐渐迈向成熟的标志,也是必经之路,Nacos提供配置加密存储-运行时轮转的核心安全能力,将在应用安全领域承担更多职责。
|
2月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
326 2
|
2月前
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
276 13
|
2月前
|
Java 测试技术 Spring
简单学Spring Boot | 博客项目的测试
本内容介绍了基于Spring Boot的博客项目测试实践,重点在于通过测试驱动开发(TDD)优化服务层代码,提升代码质量和功能可靠性。案例详细展示了如何为PostService类编写测试用例、运行测试并根据反馈优化功能代码,包括两次优化过程。通过TDD流程,确保每项功能经过严格验证,增强代码可维护性与系统稳定性。
131 0