Springboot项目中Controller层的单元测试

源码展示:

原来的controller类:

java 复制代码
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/web")
@Slf4j
@Service
public class WebController {


    @RequestMapping("/get")
    public String get(){
        log.info("get");
        return "get";
    }

    @PostMapping("/post")
    public String post(@RequestBody Student student){
        log.info("post method student={}",student );
        return "post success";
    }


    @PostMapping("/postHead")
    public String postHead(@RequestHeader("token") String token){
        log.info("token : "+token);
        return "post head token:"+token;
    }


}

自己定义的一个测试对象student:

java 复制代码
import lombok.Data;

@Data
public class Student {
    private String name;
    private int age;
}

测试代码:

java 复制代码
package org.qjg.controller;

import cn.hutool.core.lang.Assert;
import com.alibaba.fastjson.JSON;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.context.WebApplicationContext;

import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;


@Slf4j
@SpringBootTest
class WebControllerTest {

    private MockMvc mockMvc;

    private HttpHeaders headers;

    @Resource
    private WebApplicationContext webApplicationContext;

    private String baseUrl = "/web";


    @BeforeEach
    public void init() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();//或者使用普通的map也是可以的
        map.add("token", "qjg-token");

        headers = new HttpHeaders();
        headers.putAll(map);
        ;
    }

    @SneakyThrows
    @Test
    void get() {
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get(baseUrl + "/get")
                .headers(headers)
                .contentType(MediaType.APPLICATION_JSON)

        ).andExpect(MockMvcResultMatchers.status().isOk()).andReturn();

        String contentAsString = mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8);
        log.info("contentAsString: " + contentAsString);
    }


    @SneakyThrows
    @Test
    void post() {

        Student student = new Student();
        student.setAge(18);
        student.setName("张三");
        MvcResult mvcResult = mockMvc.perform(

                MockMvcRequestBuilders.post(baseUrl + "/post")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(JSON.toJSONString(student))
                        .headers(headers)

        ).andExpect(MockMvcResultMatchers.status().isOk()).andReturn();

        String contentAsString = mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8);
        log.info("contentAsString: " + contentAsString);

    }

    @SneakyThrows
    @Test
    void postHead() {
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post(baseUrl + "/postHead")
                .contentType(MediaType.APPLICATION_JSON).content("")
                .headers(headers)
        ).andExpect(MockMvcResultMatchers.status().isOk()).andReturn();


        String contentAsString = mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8);
        Assert.isTrue("post head token:qjg-token".equals(contentAsString));
    }
}
相关推荐
MetaLite19 分钟前
AI编程与工程底座-让AI遵守SpringBoot边界
人工智能·spring boot·ai编程
IT_陈寒38 分钟前
Python的多线程居然是个假把式?搞清GIL让我少熬三天夜
前端·人工智能·后端
明月_清风40 分钟前
位图与布隆过滤器:海量数据下的"存在性判断"艺术
前端·后端·算法
明月_清风1 小时前
Hash 表从入门到精通:Go 实战与工程细节
前端·后端·算法
考虑考虑1 小时前
ElasticSearch索引命令
运维·后端·elasticsearch
玉宇夕落2 小时前
背单词项目一:融会贯通:从零构建"单词大师"后台——Next.js + Supabase + Drizzle 全栈开发实战
后端
橙序员小站2 小时前
从 Demo 到生产:Agent Harness 如何把 AI 真正“接”进项目
后端·aigc·ai编程
她的男孩3 小时前
一个开源低代码框架的协作 SPI 是怎么设计的 ForgeAdmin 拆解 + 实战接入新平台
后端·算法·架构
蓝山6163 小时前
Python 字典(Dictionary)完全指南:从入门到实战
后端
foggyprojects3 小时前
在 DeepSeek Harness 里跑通 Foggy:从安装插件到第一次问数
后端