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));
    }
}
相关推荐
Nanjo_FanY13 分钟前
Spring Boot 3/4 可观测落地指南
后端
PFinal社区_南丞31 分钟前
Go语言开发AI智能体:从Function Calling到Agent框架
后端·go
货拉拉技术1 小时前
货拉拉海豚平台-大模型推理加速工程化实践
人工智能·后端·架构
神奇小汤圆1 小时前
请不要自己写,Spring Boot非常实用的内置功能
后端
神奇小汤圆1 小时前
突破Netty极限:基于Java 21 FFM API手写高性能网络通信框架
后端
Java编程爱好者1 小时前
给 Spring Boot 接口加了幂等保护:Token 机制 + 结果缓存,一个注解搞定
后端
Java编程爱好者2 小时前
字节二面:Redis 能做消息队列吗?怎么实现?
后端
爱找乐子的李寻欢2 小时前
防止字符串 ID 隐式转换导致的数据越权漏洞
后端
JavaGuide2 小时前
字节二面:Redis 能做消息队列吗?怎么实现?
redis·后端
暮色妖娆丶3 小时前
不过是吃了几年互联网红利罢了,我高估了自己
java·后端·面试