首页 > 编程语言 >java 单元测试之 - Spring框架提供的单元/集成测试注解

java 单元测试之 - Spring框架提供的单元/集成测试注解

时间:2023-12-07 18:55:21浏览次数:27  
标签:java Spring 单元测试 测试 组件 注解 加载

java 单元测试之 - Spring框架提供的单元/集成测试注解

Spring框架提供了很多注解来辅助完成单元测试和集成测试(备注:这里的集成测试指容器内部的集成测试,非系统间的集成测试),先看看Spring框架提供了哪些注解以及对应的作用。@RunWith(SpringRunner.class) / @ExtendWith(SpringExtension.class)
用于在测试类中启用 Spring 框架的支持。@RunWith 是 JUnit 4 的注解,而 @ExtendWith 是 JUnit 5 的注解,用于取代 @RunWith。
这些注解会加载 Spring 上下文,支持 Spring 相关的功能如依赖注入和使用 Spring 注解等。
@SpringBootTest:
用于在测试类中加载完整的 Spring Boot 应用程序上下文。自动配置应用程序上下文,包括所有的配置、Bean 和组件,以及所有相关的依赖项。通常与 @RunWith 或 @ExtendWith 一起使用。
@AutoConfigureMockMvc:
自动配置 MockMvc 对象,用于模拟 Spring MVC 请求和响应。通常与 @SpringBootTest 结合使用,用于测试 MVC 控制器层的行为。
@DataJpaTest:
用于测试与 JPA 相关的功能。自动配置嵌入式数据库,并加载与 JPA 相关的组件。仅加载 JPA 相关的组件,提高测试的精确性和速度。
@WebMvcTest:
用于测试 Spring MVC 控制器层的功能。自动配置 MockMvc,并加载控制器层相关的组件,如控制器、拦截器等。通常需要手动指定需要加载的其他组件。
@DataMongoTest:
用于测试与 MongoDB 相关的功能。自动配置嵌入式 MongoDB,并加载与 MongoDB 相关的组件。
@RestClientTest:
用于测试使用 Spring 的 RestTemplate 进行 HTTP 请求的功能。自动配置 RestTemplateBuilder,并加载相关的组件。
@Sql:
用于在测试执行前或执行后运行 SQL 脚本。可以用于准备测试数据或清理测试环境。
@TestPropertySource:
用于在测试中指定要加载的属性文件。可以覆盖应用程序中的属性配置,方便测试不同的配置。 

可以看到在上面的注解中,@AutoConfigureMockMvc和@WebMvcTest都是用于测试Controller层的测试,那么他们之间有什么区别呢?@AutoConfigureMockMvc 用于单元测试或轻量级的集成测试,只自动配置 MockMvc,主要关注控制器的行为测试。@WebMvcTest 用于集成测试,除了自动配置 MockMvc,还会加载控制器层相关的组件,可以测试整个控制器层的功能和交互。

上面是一些概念介绍,下面看看具体例子。如下图所示,controller层中有一个post方法,为这个post方法编写单元测试,里面用的了mockMvc注解。对于Controller class依赖的usersService Class,下面的测试中用了@MockBean注解,这样可以在后面控制usersService的行为,例如 given(userService.createUser(any(UserDto.class))).willReturn(userDto);因为对userService的行为进行的stub,这样controller层方法返回的结果也是受控制的,在后面的单元测试中,就隔离了对usersService实际结果的依赖,只测试controller层的代码逻辑。

为了更好的理解mockMvc可以再看下面一个更简单的例子,下面例子中左边是一个BookController的假代码,右边是对这个Controller的单元测试代码。class上面使用@WebMvcTest注解,用@MockBean管理依赖的服务bookService,用mockMvc模拟发起请求,接着通过.andExpect()验证得到的结果是否符合预期。

 上面是编写单元测试,如果要为controller层的接口编写容器内的集成测试呢?具体测试如下所示:集成测试中会用到@SpringBootTest注解,,用restTemplate在启动的本地端口上调用controller层的接口,然后校验接口返回内容。

除了controller层的单元测试和集成测试,我们再来看看spring框架提供的其他常用注解使用例子。如下图所示使用@DataMongoTest注解编写Repository层class的单元测试,使用@DataMongoTest 注解,它会加载 BookRepository 相关的组件,并创建一个嵌入式 MongoDB 数据库。另外,还使用了 @TestPropertySource 注解来指定 MongoDB 的连接属性,这样测试可以连接到指定的数据库。

需要注意:在实际项目DB层通常都有现成的框架来负责数据的CRUD,例如spring jpa等,自身写的额外查询、修改数据的逻辑较少,如果要为repository层编写单元测试,应该重点对定制化了sql语句的repository层代码。

和@MongoTestdata注解类似的,还有@DataJpaTest注解,@DataJpaTest是 Spring Boot 测试框架中用于测试与 JPA 相关的功能的注解。它提供了一个轻量级的方式来测试 JPA 数据访问层(Repository)的功能,而不需要加载整个 Spring Boot 应用程序上下文。下图是使用@DataJpaTest注解为Repository层代码添加单元测试例子。

 使用了@DataJpaTest注解,它会加载BookRepository相关的组件,并创建一个嵌入式数据库(H2 数据库)。另外,还使用了 @TestPropertySource 注解来指定数据库的连接属性,这样测试可以连接到指定的数据库。需要注意一点,因为这个注解是专门为Spring Jpa框架创建的,如果数据库选的框架不是spring jpa,那么,则无法使用@DataJpaTest注解。

除了前面数据库相关的注解外,再来看看如何使用@RestClientTest注解。下图是使用@RestClientTest注解为使用了restTemplate调用外部接口的代码添加单元测试,使用了 @RestClientTest(BookClient.class) 注解,它会加载 BookClient 相关的组件,并创建一个带有 MockRestServiceServer的RestTemplate 实例。MockRestServiceServer 可以用于模拟外部 REST 服务的响应,从而测试 BookClient 与外部服务的交互。

以上就是Spring框架提供的常用测试相关注解的使用说明。

原文链接:https://blog.csdn.net/qiaotl/article/details/132069018

标签:java,Spring,单元测试,测试,组件,注解,加载
From: https://www.cnblogs.com/sunny3158/p/17883711.html

相关文章

  • Java Mockito 快速入门指南 Mock是指使用Mockito创建的模拟对象,它模拟真实对象的行为,
    JavaMockito快速入门指南Mock是指使用Mockito创建的模拟对象,它模拟真实对象的行为,用于替代真实对象的依赖项,以便进行独立的单元测试在软件开发中,单元测试对于确保代码的正确性和可靠性至关重要。Mockito是一个强大的Java测试框架,它提供了丰富的功能和方法,使得编写模拟测试变得......
  • springboot018母婴商城-计算机毕业设计源码+LW文档
    一、选题背景以母婴人群和准母婴人群及其家庭群体为目标用户。站在整个社会产业的角度,有些产业为所有用户提供某类基本需求,有些产业为某类用户提供某类特定需求,而母婴产业是最终满足特定人群相关多元化需求的一个宽辐射市场。母婴产品及服务最终以线上与线下为出口抵达用户,从市场......
  • springboot019高校心理教育辅导设计与实现-计算机毕业设计源码+LW文档
    1.1选题的意义和目的当今社会,经济飞速发展,科技日新月异,人际关系复杂多变,整个社会生活节奏越来越快,人们承受的生活压力越来越大。而对于在校大学生来说,他们还未完全融入到社会之中,但他们却依然要面对这些社会问题,他们要不断地学习新的知识,要开始学会如何解决身边地人际关系问题,要面......
  • Java基本数据类型转换
    1.Java基本数据类型转换1.1自动类型转换当Java程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型这个就是自动类型转换数量类型按精度大小排序为:char<int<long<float<doublebyte<short<int<long<float<doubleinta='c';doubled=80注意:有多种类型......
  • Springboot AOP注解实现切面拦截
    注解声明@Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfacexxxAnnotation{/***注解属性*/Objectxxx()default5;}注解逻辑实现/***@authoralpha.*@classNamexxxAn......
  • Java数据类型
    1.数据类型每一种数据都定义了明确的数据类型,在内存中分配大小不同的内存空间(字节)8大基本数据类型整数类型:存放整数byte,1个字节short,2个字节int,4个字节(默认)long,8个字节浮点类型(小数)float,4个字节double,8个字节(默认)字符型:char,2个字节布尔型:boolean,1个字......
  • java打包好的jar包在Linux服务器上指定端口并后台运行命令
    前提条件:a.已经在Linux服务器上安装了java环境。b.切换到jar包所在的目录下。c.运行方式为:java-jar运行。举例说明:包名  运行端口test.jar  8080命令如下:java-jar-Dserver.port=8080test.jar&>test.out&1解释:1.表示将test.jar这个jar包运行在8080端口(前提是端口......
  • SpringBoot整合邮箱发送验证码
    1、以QQ邮箱为例,点开设置开启POP3/SMTP服务2、创建一个springboot项目1)引入maven依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>2)配置yml文件spring:......
  • java中禁用科学计数法的处理
    importjava.text.DecimalFormat;publicclassDisableScientificNotationExample{publicstaticvoidmain(String[]args){doublenumber=123456789.123456789;//创建DecimalFormat对象,设置输出格式DecimalFormatdecimalFormat=newD......
  • Springcloud学习笔记58--SpringBoot拦截全局异常统一处理(RestControllerAdvice注解)
    1. 应用场景如果和前端约定好使用固定的自定义格式返回参数,如下:{"code":200,"msg":"操作成功","data":{"equipment":55,"code":99,"point":2}}但在运行时发现了异常,默认的异常返回格式如下:......