Springboot整合MockMvc 测试


传参问题

GET[select]

1.路径参数 : @PathVariable

2.表单参数 : @RequestParam

 

POST[insert]: 1.JSON请求体参数  :  @RequestBody

 

PUT[update]: 1.路径参数  :  @PathVariable

2.表单参数  :  @RequestParam

 

DELETE[delete]: 1.路径参数  :  @PathVariable

2.表单参数  :  @RequestParam

 

MockMvc:

1.路径请求

mockMvc.perform(MockMvcRequestBuilders
.请求方式(“url
/ {path}”,参数值)

示例:
//执行请求(使用GET请求)
MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders
.get("/vnone/{userId}","123") //路径传参.
.accept(MediaType.APPLICATION_JSON_UTF8))
.andDo(MockMvcResultHandlers.print()) // MockMvcResultHandlers.print() 日志打印会更清晰
.andReturn();


2.表单请求 mockMvc.perform(MockMvcRequestBuilders .请求方式(“url”).param(“键”,“值”).contentType(MediaType.APPLICATION_FORM_URLENCODED)

示例:
 
 
//执行请求(使用GET请求)
MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders
.get("/vnone")
.param("mailNo", "SF12345678") //路径传参.
.accept(MediaType.APPLICATION_JSON_UTF8))
.andDo(MockMvcResultHandlers.print()) // MockMvcResultHandlers.print() 日志打印会更清晰
.andReturn();


3.JSON请求

示例:

String requestBody = "{\"id\":1, \"name\":\"zhang\"}"; MvcResult mvcResult = mockMvc.perform(post("/user")  .contentType(MediaType.APPLICATION_JSON).content(requestBody)  .accept(MediaType.APPLICATION_JSON)) //执行请求   .andExpect(jsonPath("$.id").value(1)); //使用Json path验证JSON 请参考http://goessner.net/articles/JsonPath/  
异步测试:

//Callable  
    MvcResult result = mockMvc.perform(get("/user/async1?id=1&name=zhang")) //执行请求  
            .andExpect(request().asyncStarted())  
            .andExpect(request().asyncResult(CoreMatchers.instanceOf(User.class))) //默认会等10秒超时  
            .andReturn();  
      
    mockMvc.perform(asyncDispatch(result))  
            .andExpect(status().isOk())  
            .andExpect(content().contentType(MediaType.APPLICATION_JSON))  
            .andExpect(jsonPath("$.id").value(1));  
文件上传:

byte[] bytes = new byte[] {1, 2};  
mockMvc.perform(fileUpload("/user/{id}/icon", 1L).file("icon", bytes)) //执行文件上传  
        .andExpect(model().attribute("icon", bytes)) //验证属性相等性  
        .andExpect(view().name("success")); //验证视图 
验证请求参数绑定到模型数据及Flash属性:

mockMvc.perform(post("/user").param("name", "zhang")) //执行传递参数的POST请求(也可以post("/user?name=zhang"))  
            .andExpect(handler().handlerType(UserController.class)) //验证执行的控制器类型  
            .andExpect(handler().methodName("create")) //验证执行的控制器方法名  
            .andExpect(model().hasNoErrors()) //验证页面没有错误  
            .andExpect(flash().attributeExists("success")) //验证存在flash属性  
            .andExpect(view().name("redirect:/user")); //验证视图  

 

测试类:

 

package com.vn.vnone;

import com.vn.vnone.service.VnoneService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockServletContext;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import java.util.concurrent.atomic.AtomicInteger;

import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.in;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;


@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {VnoneApplication.class, MockServletContext.class})
@WebAppConfiguration
@Slf4j
class VnoneApplicationTests {

    /**
     * 引入 webApplicationContext 之后,才可以在测试类中使用  servcie 、dao层注入的对象
     */
    @Autowired
    private WebApplicationContext webApplicationContext;

    @Mock
    private VnoneService vnoneService;

    private MockMvc mvc;

    // Spring Boot 2.2.9 默认使用的是junit 5,在junit 5中 @Before 被 @BeforeEach代替。
    @BeforeEach
    public void setUp() throws Exception {

        mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

    @Test
    void getUser() throws Exception {

        // 测试VnoneController
        RequestBuilder request = null;

        // 1、get查一下user列表,应该为空
        request = get("/vnone");
        mvc.perform(request)
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("vn/vnone")))
                .andDo(MockMvcResultHandlers.print());

    }

    @Test
    void createUser() throws Exception {


        //执行请求(使用POST请求)
        MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders
                        .post("/vnone")
                        .param("username", "vn")
                        .param("age", "10")  //若无参数则不写param.
                        .accept(MediaType.APPLICATION_JSON_UTF8))
                .andDo(MockMvcResultHandlers.print())  // MockMvcResultHandlers.print()  日志打印会更清晰
                .andReturn();

        //获取返回编码
        int status = mvcResult.getResponse().getStatus();
        //获取返回结果
        String content = mvcResult.getResponse().getContentAsString();
        //断言,判断返回编码是否正确
        Assert.assertEquals(200, status);
        System.out.println("--------返回的json = " + content);

    }

}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM