SpringBoot中的测试(test)
SpringBoot2.2之后用的Junit5,所以在这里使用的Junit5。Spring Boot会默认帮我们导入包,所以不用添加依赖了。
注解:
@BeforeAll : 只执行一次,执行时机是在所有测试和 @BeforeEach 注解方法之前。
@BeforeEach:在每个测试执行之前执行。
@AfterEach :在每个测试执行之后执行。
@AfterAll: 只执行一次,执行时机是在所有测试和 @AfterEach 注解方法之后。
测试一下,代码如下
package com.example.demo; import org.junit.jupiter.api.*; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; @SpringBootTest class DemoApplicationTests { private MockMvc mockMvc; @BeforeAll public static void beforeAll(){ System.out.println("begin All"); } @BeforeEach public void beforeEach(){ System.out.println("begin Each"); } @Test public void test1(){ System.out.println("test1"); } @Test public void test2(){ System.out.println("test2"); } @AfterEach public void afterEach(){ System.out.println("end Each"); } @AfterAll public static void afterAll(){ System.out.println("end All"); } }
最终的输出结果为:
begin All
begin Each
test1
end Each
begin Each
test2
end Each
end All
assert(断言)。一般的断言,无非是检查一个实例的属性(比如,判空与判非空等),或者对两个实例进行比较(比如,检查两个实例对象是否相等)等
-
assertEquals(A,B,"message")
,判断A对象和B对象是否相等,这个判断在比较两个对象时调用了equals()
方法。 -
assertSame(A,B,"message")
,判断A对象与B对象是否相同,使用的是==
操作符。 -
assertTrue(A,"message")
,判断A条件是否为真。 -
assertFalse(A,"message")
,判断A条件是否不为真。 -
assertNotNull(A,"message")
,判断A对象是否不为null
。 -
assertArrayEquals(A,B,"message")
,判断A数组与B数组是否相等
MockMvc。对Controller的测试需要用到MockMvc技术
首先初始化MockMvc
private MockMvc mockMvc; @Autowired private WebApplicationContext wac; @Before public void setupMockMvc(){ mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); }
然后使用mockMvc模拟请求
模拟get请求带参数
mockMvc.perform(MockMvcRequestBuilders.get("/hello?name={name}","zeng"));
模拟post请求
mockMvc.perform(MockMvcRequestBuilders.post("/user").param("name", "zhang")) //执行传递参数的POST请求(也可以post("/user?name=zhang"))
模拟文件上传
mockMvc.perform(MockMvcRequestBuilders.fileUpload("/fileupload").file("file", "文件内容".getBytes("utf-8")));
也可以直接使用MultiValueMap
构建参数
MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>(); params.add("name", "zeng"); params.add("password", "123"); params.add("id", "1"); mockMvc.perform(MockMvcRequestBuilders.get("/stu").params(params));
模拟session和cookie
mockMvc.perform(MockMvcRequestBuilders.get("/index").sessionAttr(name, value)); mockMvc.perform(MockMvcRequestBuilders.get("/index").cookie(new Cookie(name, value)));
模拟HTTP请求头:
mockMvc.perform(MockMvcRequestBuilders.get("/user/{id}", 1).header(name, values));
设置请求的Content-Type:
mockMvc.perform(MockMvcRequestBuilders.get("/index").contentType(MediaType.APPLICATION_JSON_UTF8));
设置返回格式为JSON:
mockMvc.perform(MockMvcRequestBuilders.get("/user/{id}", 1).accept(MediaType.APPLICATION_JSON));
mockMvc处理返回结果
期望成功调用,即HTTP Status为200:
mockMvc.perform(MockMvcRequestBuilders.get("/user/{id}", 1))
.andExpect(MockMvcResultMatchers.status().isOk());
期望返回内容是application/json
:
mockMvc.perform(MockMvcRequestBuilders.get("/user/{id}", 1))
.andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON));
检查返回JSON数据中某个值的内容:
mockMvc.perform(MockMvcRequestBuilders.get("/user/{id}", 1))
.andExpect(MockMvcResultMatchers.jsonPath("$.name").value("zzz"))
这里使用到了jsonPath
,$
代表了JSON的根节点.
比较返回内容,使用content()
:
// 返回内容为hello mockMvc.perform(MockMvcRequestBuilders.get("/index")) .andExpect(MockMvcResultMatchers.content().string("hello")); // 返回内容是XML,并且与xmlCotent一样 mockMvc.perform(MockMvcRequestBuilders.get("/index")) .andExpect(MockMvcResultMatchers.content().xml(xmlContent)); // 返回内容是JSON ,并且与jsonContent一样 mockMvc.perform(MockMvcRequestBuilders.get("/index")) .andExpect(MockMvcResultMatchers.content().json(jsonContent));
比较forward或者redirect:
mockMvc.perform(MockMvcRequestBuilders.get("/index")) .andExpect(MockMvcResultMatchers.forwardedUrl("index.html")); // 或者 mockMvc.perform(MockMvcRequestBuilders.get("/index")) .andExpect(MockMvcResultMatchers.redirectedUrl("index.html"));
输出响应结果:
1 2 | mockMvc.perform(MockMvcRequestBuilders. get ( "/index" )) .andDo(MockMvcResultHandlers.print()); |
在测试过程中如果要对数据库添加、删除、修改数据可以使用@Transactional,使数据能够回滚。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~