当前位置:首页 >> 硬件技术 >> 【springboot单元测试,集成测试】,foxmail6.5官方下载(springboot 单测)

【springboot单元测试,集成测试】,foxmail6.5官方下载(springboot 单测)

cpugpu芯片开发光刻机 硬件技术 1
文件名:【springboot单元测试,集成测试】,foxmail6.5官方下载 【springboot单元测试,集成测试】

本文介绍一下SpringBoot中的测试方法

集成测试

@SpringBootTest

一个普通的web api

@RequestMapping@RestControllerpublic class HelloController {@AutowiredRestTemplate restTemplate;@GetMapping(value = "/api/hi")public Map<String,Object> hello() {String baiduRes = restTemplate.getForObject("https://www.baidu.com", String.class);Map<String, Object> res = new HashMap<>();res.put("status", "中");res.put("msg", baiduRes);return res;}}

测试类:

package xyz.bliu.sptest;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.web.servlet.MockMvc;import org.springframework.web.client.RestTemplate;import static org.assertj.core.api.Assertions.assertThat;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;@SpringBootTestpublic class ControllerTest02 {@AutowiredRestTemplate restTemplate;@AutowiredMockMvc mockMvc;@Testpublic void restTemplateShouldNotNull() {assertThat(restTemplate).isNotNull();}@Testpublic void testGetRequest() throws Exception {mockMvc.perform(get("/api/hi")).andExpect(status().isOk()).andDo(print());}}

使用mockMvc好处是不会启动真实的web服务 当然你可以使用@SpingBootTest 并且注入一个RestTemplate来做真实的请求

假如希望仅仅测试controller层时, 可以使用另外一个注解 @WebMvcTest 他有一个参数可以指定测试的controller

package xyz.bliu.sptest;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;import org.springframework.boot.test.mock.mockito.MockBean;import org.springframework.test.web.servlet.MockMvc;import org.springframework.web.client.RestTemplate;import xyz.bliu.sptest.controller.HelloController;import static org.assertj.core.api.Assertions.*;import static org.mockito.Mockito.when;import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;@WebMvcTest(controllers = HelloController.class)public class ControllerTest01 {@AutowiredMockMvc mockMvc;@MockBeanRestTemplate restTemplate;@Testpublic void helloShouldOK() throws Exception {when(restTemplate.getForObject("https://www.baidu.com", String.class)).thenReturn("haha");assertThat(mockMvc).isNotNull();mockMvc.perform(get("/api/hi").header("kk", "v1").header("Content-Type", "application/json")).andDo(print()).andExpect(content().contentType("application/json")).andExpect(content().json("{'status':'中', 'msg':'haha'}"));}@Testpublic void restTemplateShouldBeNull() {assertThat(restTemplate).isNull();}}

这样仅会加载指定的controller和一些web层的东西不会加载其他Bean 假如这个controller中依赖其他的bean怎么办呢? 答案是需要使用@MockBean去Mock依赖的行为

例如我这里的处理

@MockBeanRestTemplate restTemplate;when(restTemplate.getForObject("https://www.baidu.com", String.class)).thenReturn("haha");

其实就是说当调用restTemplate.getForObject(“https://www.baidu.com”, String.class)时,方法会返回“haha”


@WebMvcTest VS @SpringBootTest

显然当你只需要测试你的controller接收请求参数或者返回值时你可以使用@WebMvcTest, 因为它不需要加载整个application context, 因此会使你的test更快

然而当需要集成测试时则需要@SpringBootTest 并且他们是不能同时使用的

另外你可能注意到了AssertJ 提供的 assertThat api非常好用,可以流式调用

另外本文测试环境为spring boot 3.x 和 Junit5 如果你使用是springboot 2.x 你可能还需要 @RunWith(SpringRuner.class) ( junit4)或者 @extendwith(springextension.class) (junit5)

当然你可以使用@SpingBootTest 并且注入一个RestTemplate来做真实的请求 package xyz.bliu.sptest;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.boot.test.web.server.LocalServerPort;import org.springframework.web.client.RestTemplate;import java.util.Map;import static org.assertj.core.api.Assertions.assertThat;@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)public class ControllerTest03 {@AutowiredRestTemplate restTemplate;@LocalServerPortint port;@Testpublic void testGet() {Map resp = restTemplate.getForObject("http://localhost:"+port+ "/api/hi", Map.class);assertThat(resp.get("status").toString()).isEqualTo("中");}}
协助本站SEO优化一下,谢谢!
关键词不能为空
同类推荐
«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接