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));
    }
}
相关推荐
GetcharZp30 分钟前
彻底告别数据焦虑!这款开源神器 RustDesk,让你自建一个比向日葵、ToDesk 更安全的远程桌面
后端·rust
jack_yin2 小时前
Telegram DeepSeek Bot 管理平台 发布啦!
后端
小码编匠2 小时前
C# 上位机开发怎么学?给自动化工程师的建议
后端·c#·.net
库森学长2 小时前
面试官:发生OOM后,JVM还能运行吗?
jvm·后端·面试
转转技术团队2 小时前
二奢仓店的静默打印代理实现
java·后端
蓝易云2 小时前
CentOS 7上安装X virtual framebuffer (Xvfb) 的步骤以及如何解决无X服务器的问题
前端·后端·centos
上上迁2 小时前
分布式生成 ID 策略的演进和最佳实践,含springBoot 实现(Java版本)
java·spring boot·分布式
秋千码途2 小时前
小架构step系列07:查找日志配置文件
spring boot·后端·架构
蓝倾3 小时前
京东批量获取商品SKU操作指南
前端·后端·api
开心就好20254 小时前
WebView远程调试全景指南:实战对比主流工具优劣与适配场景
后端