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));
    }
}
相关推荐
明月_清风1 分钟前
🚀 Flyway 存量数据库迁移:50张表一键导出清洗实战(附完整脚本)
数据库·后端
妙蛙种子3119 分钟前
【Java设计模式 | 创建者模式】 抽象工厂模式
java·开发语言·后端·设计模式·抽象工厂模式
雄哥00712 分钟前
spring 升级记录
java·后端·spring·spring升级
前端付豪18 分钟前
实现记忆开关
前端·后端
还是大剑师兰特23 分钟前
Vitest单元测试教程
单元测试
神奇小汤圆24 分钟前
Netflix用它省了10%的CPU:JDK Vector API实战
后端
神奇小汤圆28 分钟前
用300行代码手写SpringBoot核心原理
后端
chrislearn38 分钟前
Salvo 与 Axum 的设计思想对比
后端
武子康43 分钟前
大数据-262 实时数仓 - Canal 同步数据实战指南 实时统计
大数据·hadoop·后端
一定要AK43 分钟前
Spring 核心容器从入门到精通
java·后端·spring