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));
    }
}
相关推荐
Reart5 分钟前
Leetcode 121. 买卖股票的最佳时机(717)
后端·算法
Reart24 分钟前
Leetcode 337.打家劫舍3(717)
后端·算法
站大爷IP1 小时前
Python的浅拷贝把我坑惨了,原来copy()和deepcopy()的区别这么大
后端
卷无止境2 小时前
Apache Ossie:打破数据孤岛的语义互操作标准
后端·数据分析
晓杰在写后端2 小时前
从0到1实现Balatro游戏后端(11):商店商品池与运行时商品实例生成
后端·游戏开发
AskHarries3 小时前
OAuth 登录怎么接
后端
大师兄66684 小时前
HarmonyOS7 单元测试:从 @Test 到覆盖率
单元测试·覆盖率·harmonyos7
掘金者阿豪4 小时前
上线前能跑,上线后挂了,三个隐性的SQL陷阱
后端
用户8356290780514 小时前
如何使用 Python 为 PDF 添加和管理图层
后端·python
SimonKing4 小时前
那个号称"对标 Spring"的国产框架 Solon,到底行不行?
java·后端·程序员