Spring Boot 3.x Web单位测试最佳实践

[复制链接]
发表于 2026-2-10 21:10:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
上一篇:Spring Boot 3.x Rest API同一非常处理处罚最佳实践
下一篇:Spring Boot 3.x Filter实战:记载哀求日志日志
Spring Boot为我们提供了非常便捷的web层Rest API单位测试的API,这种开辟本领也是小搭档必须要把握的。怎样对数据库、中央件服务以及远程调用在开辟情况不可利用的情况举行Rest API功能测试,本教程将为小搭档揭秘。假如以为对你有资助,记得点赞收藏,关注小卷,后续更出色!


  
依靠与设置

接下来我们通过web单位测试来对之前开辟好的API举行测试,先看下build.gradle中跟单位测试相干的设置:
  1. dependencies {
  2.    
  3.    
  4.     ...
  5.     // 为单元测试环境引入和启用lombok编译功能
  6.     testAnnotationProcessor 'org.projectlombok:lombok'
  7.     testImplementation 'org.springframework.boot:spring-boot-starter-test'
  8.     testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
  9.     ...
  10. }
  11. tasks.named('test') {
  12.    
  13.    
  14.     useJUnitPlatform()
  15. }
复制代码
创建单位测试

创建单位测试的方式,在API接口上利用组合键Alt+Enter(这里对idea利用eclipse风格的快捷键),好比:

点击创建Test,选择默认的junit5单位测试框架,并选择要测试的方法,点创建:

mock mvc测试

看下面的单位测试结构:
  1. package com.juan.demo.api;
  2. import ...
  3. import static org.junit.jupiter.api.Assertions.*;
  4. @WebMvcTest(CartAPI.class)
  5. class CartAPITest {
  6.    
  7.    
  8.     @Resource
  9.     private MockMvc mvc;
  10.     @Test
  11.     void addCartItem() {
  12.    
  13.    
  14.         assertNotNull(mvc);
  15.     }
  16. }
复制代码
我们在类的头部利用@WebMvcTest注解,表明要启动一个web测试的应用模拟情况,也就是说并不会启动一个spring boot应用的真正上下文情况,对于须要注入的组件须要额外mock出来,直接运行以上单位测试用例,得到如许的错误:

  1. ...
  2. Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.juan.demo.service.CartService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@jakarta.annotation.Resource(shareable=true, lookup="", name="", description="", authenticationType=CONTAINER, type=java.lang.Object.class, mappedName="")}
  3. ...
复制代码
@MockBean注解

为此,我们可以通过@MockBean注解来注入一个模拟实现的CartService组件:
  1. ...
  2. class CartAPITest {
  3.    
  4.    
  5.     ...
  6.    
  7.     @MockBean
  8.     private CartService cartService;
  9.    
  10.     ...
  11. }
复制代码
如许再启动单位测试,实行效果绿条,我们就模拟出了要测试的API的web情况,并对其依靠的配景组件举行模拟注入,以确保模拟上下文可以正常举行依靠注入。但是须要注意:对哪些API接口启动模拟测试情况是由@WebMvcTest注解控制的,默认是全部的API,也可以指定(这里我们指定API接口即可),好比这里我们指定的是CartAPI,而假如我们指定成@WebMvcTest(HelloAPI.class),则很显然,情况依靠更简朴(无需用@@MockBean注解注入任何模拟依靠)。
   动一动小手
  小搭档们可以按照上述注意事项,自行做实行来验证结论。
  实行哀求发送

情况启动ok,有了模拟mvc的MockMvc实例之后,就可以在启动的web模拟情况中借助MockMvc实例来发送和测试API哀求了。看下测试用例:
  1. package com.juan.demo.api;
  2. import ...
  3. import static org.junit.jupiter.api.Assertions.assertNotNull;
  4. import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
  5. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  6. @WebMvcTest(CartAPI.class)
  7. class CartAPITest {
  8.    
  9.    
  10.     @Resource
  11.     private MockMvc mvc;
  12.     @MockBean
  13.     private CartService cartService;
  14.     @SneakyThrows
  15.     @Test
  16.     void addCartItem() {
  17.    
  18.    
  19.         assertNotNull(mvc);
  20.         this.mvc.perform(post("/personal/cart")
  21.                         .accept(MediaType.APPLICATION_JSON_VALUE)
  22.                         .contentType(MediaType.APPLICATION_JSON_VALUE)
  23.                         .content("{"p":2,"q":4}"))
  24.                 .andExpect(status().isOk());
  25.     }
  26. }
复制代码
从测试API支持的连缀写法,以及静态方法的包裹调用,一清二楚,这里我们发送了一个路径为/personal/cart的添加购物车API哀求,发送和吸取的都是json格式,发送的数据硬编码的json字符串,盼望返回的http状态码为200。注意,这里perform方法会抛出非常,为了简化处理处罚我们在测试用例上加了@SneakyThrows注解。
启动单位测试,测试ok,从控制台输出的日志日志可以看出,CartService的addCartItem方法返回的效果为空:

为什么会如许呢?显着我们在CartService的实现中对这种
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表