Java单元测试:使用spring-boot-test库完成MVC控制器的单元测试

本文详细介绍了如何在Spring Boot项目中进行单元测试,通过MockMvc模拟浏览器对Controller的方法进行GET和POST请求。首先,引入spring-boot-starter-test库,然后创建MockMvc对象并构建请求,包括URL、参数、头信息和cookie。接着,对响应结果进行断言,确保状态码和内容符合预期。提供了完整的代码示例,方便开发者对照解决测试问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单元测试第五篇,演示在单元测试时,如何模拟浏览器访问Controller里的方法,进行测试和验证。
相关代码已经放在Github上:源代码

下面简述开发过程:
1、首先,还是正常建立项目,并有常规的MongoDB操作的业务逻辑;

2、项目添加spring-boot-starter-test库的引用,打开pom.xml,添加:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

注1:scope为test,是仅在单元测试时引入,运行时并不引入。

3、application.yml配置文件无需修改.

4、在单元测试代码里,创建MockMvc对象,后续的单元测试,都要用它执行:

@Autowired
private WebApplicationContext webApplicationContext;

MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();

5、http的get请求方法测试举例:

MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
// 构建一个请求
RequestBuilder builder = MockMvcRequestBuilders
        .get("/hello?query2=xxxx")              // 要请求的url路径
        .header("x-merchant-id", "12345")   // 添加请求header
        .cookie(new Cookie("", ""))           // 添加cookie,注意:不能用header方法加cookie
        .param("query1", "abcd");           // 添加请求参数,注意:直接注入方法,而不是放在QueryString里
// 发起请求
ResultActions result = mockMvc.perform(builder);
// 避免后面的print里,输出乱码
result.andReturn().getResponse().setCharacterEncoding("UTF-8");
// 对响应结果进行断言
MvcResult mvcResult = result.andExpect(MockMvcResultMatchers.status().isOk())  // 断言:响应status必须是200
        .andExpect(MockMvcResultMatchers.content().string("Hello,abcd12345")) // 断言:响应内容必须完全匹配
        .andDo(MockMvcResultHandlers.print())  // 对结果进行输出
        .andReturn();

// 获取完整响应内容
String response = mvcResult.getResponse().getContentAsString();
// 上面断言去掉,在这里用 response 进行断言也可以

6、http的post请求方法测试举例:


MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();

// 构建一个请求,包括url、header、参数
RequestBuilder builder = MockMvcRequestBuilders
        .post("/hello")
        .contentType(MediaType.APPLICATION_JSON)
        .content("{\"name\":\"张三\",\"desc\":\"哈哈\",\"sex\":15}")
        .header("x-merchant-id", "12345")
        .param("query1", "abcd");
// 发起请求
ResultActions result = mockMvc.perform(builder);
// 避免后面的print里,输出乱码
result.andReturn().getResponse().setCharacterEncoding("UTF-8");
// 断言
result.andExpect(MockMvcResultMatchers.status().isOk())
        .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON))
        // 对输出的json里,desc的值进行断言
        .andExpect(MockMvcResultMatchers.jsonPath("$.desc").value("哈哈-12345"))
        .andDo(MockMvcResultHandlers.print()); // 对结果进行输出

如果你在运行时有问题,可以下载上面的源码,进行对比,看看你的代码哪里有问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游北亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值