马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
上一篇:Spring Boot 3.x Rest API同一非常处理处罚最佳实践
下一篇:Spring Boot 3.x Filter实战:记载哀求日志
Spring Boot为我们提供了非常便捷的web层Rest API单位测试的API,这种开辟本领也是小搭档必须要把握的。怎样对数据库、中央件服务以及远程调用在开辟情况不可利用的情况举行Rest API功能测试,本教程将为小搭档揭秘。假如以为对你有资助,记得点赞收藏,关注小卷,后续更出色!
依靠与设置
接下来我们通过web单位测试来对之前开辟好的API举行测试,先看下build.gradle中跟单位测试相干的设置:
- dependencies {
-
-
- ...
- // 为单元测试环境引入和启用lombok编译功能
- testAnnotationProcessor 'org.projectlombok:lombok'
- testImplementation 'org.springframework.boot:spring-boot-starter-test'
- testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
- ...
- }
- tasks.named('test') {
-
-
- useJUnitPlatform()
- }
复制代码 创建单位测试
创建单位测试的方式,在API接口上利用组合键Alt+Enter(这里对idea利用eclipse风格的快捷键),好比:
点击创建Test,选择默认的junit5单位测试框架,并选择要测试的方法,点创建:
mock mvc测试
看下面的单位测试结构:
- package com.juan.demo.api;
- import ...
- import static org.junit.jupiter.api.Assertions.*;
- @WebMvcTest(CartAPI.class)
- class CartAPITest {
-
-
- @Resource
- private MockMvc mvc;
- @Test
- void addCartItem() {
-
-
- assertNotNull(mvc);
- }
- }
复制代码 我们在类的头部利用@WebMvcTest注解,表明要启动一个web测试的应用模拟情况,也就是说并不会启动一个spring boot应用的真正上下文情况,对于须要注入的组件须要额外mock出来,直接运行以上单位测试用例,得到如许的错误:
- ...
- 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="")}
- ...
复制代码 @MockBean注解
为此,我们可以通过@MockBean注解来注入一个模拟实现的CartService组件:
- ...
- class CartAPITest {
-
-
- ...
-
- @MockBean
- private CartService cartService;
-
- ...
- }
复制代码 如许再启动单位测试,实行效果绿条,我们就模拟出了要测试的API的web情况,并对其依靠的配景组件举行模拟注入,以确保模拟上下文可以正常举行依靠注入。但是须要注意:对哪些API接口启动模拟测试情况是由@WebMvcTest注解控制的,默认是全部的API,也可以指定(这里我们指定API接口即可),好比这里我们指定的是CartAPI,而假如我们指定成@WebMvcTest(HelloAPI.class),则很显然,情况依靠更简朴(无需用@@MockBean注解注入任何模拟依靠)。
动一动小手
小搭档们可以按照上述注意事项,自行做实行来验证结论。
实行哀求发送
情况启动ok,有了模拟mvc的MockMvc实例之后,就可以在启动的web模拟情况中借助MockMvc实例来发送和测试API哀求了。看下测试用例:
- package com.juan.demo.api;
- import ...
- import static org.junit.jupiter.api.Assertions.assertNotNull;
- import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
- import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
- @WebMvcTest(CartAPI.class)
- class CartAPITest {
-
-
- @Resource
- private MockMvc mvc;
- @MockBean
- private CartService cartService;
- @SneakyThrows
- @Test
- void addCartItem() {
-
-
- assertNotNull(mvc);
- this.mvc.perform(post("/personal/cart")
- .accept(MediaType.APPLICATION_JSON_VALUE)
- .contentType(MediaType.APPLICATION_JSON_VALUE)
- .content("{"p":2,"q":4}"))
- .andExpect(status().isOk());
- }
- }
复制代码 从测试API支持的连缀写法,以及静态方法的包裹调用,一清二楚,这里我们发送了一个路径为/personal/cart的添加购物车API哀求,发送和吸取的都是json格式,发送的数据硬编码的json字符串,盼望返回的http状态码为200。注意,这里perform方法会抛出非常,为了简化处理处罚我们在测试用例上加了@SneakyThrows注解。
启动单位测试,测试ok,从控制台输出的日志 可以看出,CartService的addCartItem方法返回的效果为空:
为什么会如许呢?显着我们在CartService的实现中对这种
|