首页 > 其他分享 >MockMVC的使用

MockMVC的使用

时间:2023-05-08 20:12:45浏览次数:37  
标签:String org 使用 springframework content import MockMVC public

简介

MockMvc是一种基于Java和JUnit的测试框架,旨在测试Spring MVC应用程序的控制器层。它可以帮助我们模拟HTTP请求,检查响应值,以及发送表单数据和文件等。 MockMvc可以与其他测试组件(如JUnit和Hamcrest)结合使用,以模拟REST API端点或用户界面的操作。

Get请求

简单示例

创建一个简单的Controller:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/mockMcv")
public class MockMvcController {

    @GetMapping("/first/connect")
    public String testConnect() {
        String result = "Hello MockMVC";
        return result;
    }

}

创建测试类,使用MockMVC

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
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;
​
​
// webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT:
// 指示Spring Boot在随机且可用的端口上启动Web服务器,避免端口冲突
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
// 自动配置MockMvc和Spring IOC容器
@AutoConfigureMockMvc
@RunWith(SpringRunner.class)
public class MockMvcControllerTest {
​
    @Autowired
    private MockMvc mockMvc;
​
    @Test
    public void testConnect() throws Exception {
        MvcResult mvcResult = mockMvc.perform(
                // Get请求,url为:/mockMcv/first/connect
                MockMvcRequestBuilders.get("/mockMcv/first/connect"))
                // 检查响应状态码是否为200
                .andExpect(MockMvcResultMatchers.status().isOk())
                // 返回一个MvcResult回调对象
                .andReturn();
        // 获取响应文本
        String content = mvcResult.getResponse().getContentAsString();
        // 通过断言来验证返回是否正确
        Assert.assertTrue(content.equals("Hello MockMVC"));
    }
​
}

直接启动Debug启动,请求成功:

注意点

上述示例中需要注意,@SpringBootTest注解需要括号中的内容

去掉@SpringBootTest括号中的内容,运行结果:

 

原因:@SpringBootTest注释用于在测试与Spring Boot应用程序的集成中启用Spring上下文,如果使用默认配置,那就是Mock模式,即加载一个伪造的Web环境,其中一些内容(例如HTTP会话和重定向)不实际触发,而只是返回一个默认值。

所以在测试期间尝试模拟HTTP请求并使用不实际存在的Session时,可能会从该会话对象中出现NullPointerException。

Get带参数

controller中新加一个带参数的Get请求:

@GetMapping("/connect/withParam")
public String testConnectWithParam(@RequestParam("id") Long id, @RequestParam("name") String name) {
    String result = "id:" + id + ",name:" + name;
    return result;
}

测试类新增对应的测试方法:

@Test
public void testConnectWithParam() throws Exception {
    MvcResult mvcResult = mockMvc.perform(
                MockMvcRequestBuilders.get("/mockMcv/connect/withParam")
                        // 通过param()存放各个请求参数
                        .param("id", "1")
                        .param("name", "MockMVC"))
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andReturn();
    String content = mvcResult.getResponse().getContentAsString();
    Assert.assertTrue(content.contains("MockMVC"));
}

Debug启动,请求成功:

Post请求

示例

controller中新加一个带Body的Post请求:

@PostMapping("/connect/withBody")
public String testConnectWithBody(@RequestBody Map<String,String> requestBody) {
    String result = JSONArray.toJSONString(requestBody);
    return result;
}

新增一个Java对象存放值:

import lombok.Data;
import java.io.Serializable;
​
@Data
public class MockMVCInfo implements Serializable {
    private static final Long serializableID = -1L;
    private Long id;
    private String name;
}

测试类新增对应的测试方法:

@Test
public void testConnectWithBody() throws Exception {
    MockMVCInfo mockMVCInfo = new MockMVCInfo();
    mockMVCInfo.setId(3L);
    mockMVCInfo.setName("MockMVC");
    MvcResult mvcResult = mockMvc.perform(
            MockMvcRequestBuilders.post("/mockMcv/connect/withBody")
                    // 指定 header中的 Content-Type为 application/json
                    .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                    // 通过content()存放Body的Json
                    .content(JSON.toJSONString(mockMVCInfo)))
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andReturn();
    String content = mvcResult.getResponse().getContentAsString();
    Assert.assertTrue(content.contains("MockMVC"));
}

Debug启动,请求成功:

注意点

1.通过RequestBody传递值,就得使用.content()方法存放Json

2.Body中使用Json,需要在header中指定Content-Type为application/json,参考Postman:

 

标签:String,org,使用,springframework,content,import,MockMVC,public
From: https://www.cnblogs.com/kzyuan/p/17382602.html

相关文章

  • 钉钉PC端使用 Blazor WebAssembly 读取用户信息
    功能:在钉钉内打开BlazorWebAssembly网站时,读取钉钉当前的用户信息,并显示启用的功能列表版本:.NET6界面库:AntDesignBlazor基础要求:1.让公司管理员设置自己为钉钉开发者2.下载钉钉RC版作为调试工具,下载地址:https://open.dingtalk.com/document/resource......
  • Jdk16中JcTree的使用问题
    因为jdk16进行了强制的模块化使用限制,需要增加add-opens去进行模块的放开,但是如果每次都需要在项目pom文件或者启动命令中增加,非常不优雅。而且很多重复的命令。所以想有没有更好的办法去解决。看了lombok1.18.20中的解决方法,这边来总结一下。lombok这个问题的讨论publica......
  • barrier 安装和使用 synergy最佳替代方案
    众所周知synergy是开源软件,但官编的正版是需要付费的,而barrier是synergyfork出的另一个版本,有热心网友便以维护,分支上开放了win和mac的下载,可以直接使用,而linux版本需要知己动手编译一下。附上github地址:https://github.com/debauchee/barrier/releases这个地址可......
  • NestJs 使用 RabbitMQ
    既然是使用RabbitMQ那先不管其他的把RabbitMQ装上再说RabbitMQ安装这里直接找他们官网就行https://www.rabbitmq.com/download.html这里我们选择使用docker安装快捷方便这里直接参考:https://juejin.cn/post/7198430801850105916我们要站在巨人的肩膀上,快速学习,具......
  • 实践|如何使用云函数去实现短信验证码功能
    目前,短信验证码广泛应用于用户注册、密码找回、登录保护、身份认证、随机密码、交易确认等应用场景。本文以使用云函数开发一个短信验证码登录注册服务为例,帮助您了解如何实现短信验证码功能。准备工作已 注册腾讯云 账号,并完成 企业实名认证。已购买短信套餐包。准备短信......
  • 【Oracle】使用xmlagg(xmlparse(content()).getclobval()拼接信息
    使用xmlagg(xmlparse(content()).getclobval()拼接信息简单来说格式如下xmlagg(xmlparse(content(内容||分割符)).getclobval()内容就是使用显示的数据部分,分隔符不同效果不同,分隔符可以使用chr()函数无分隔符xmlagg(xmlparse(content('这是一个字段:'||v.supercode||'、......
  • Java 中的机器学习正在加速图像处理 Java 开发人员可以使用预训练的机器学习模型快速
    来源: https://www.infoworld.com/article/3601711/machine-learning-in-java-is-speeding-image-processing.html 近年来,人们对机器学习的兴趣稳步增长。具体来说,企业现在在各种用例中使用机器学习进行图像识别。在 汽车行业、 医疗保健、 安全、 零售、 仓库中的自动化......
  • 关于Curl命令的使用
    最常用的curl命令1、发送GET请求curlURL例:curlURL?a=1&b=nihao2、发送POST请求curl-XPOST-d'a=1&b=nihao'URL3、发送json格式请求curl-H"Content-Type:application/json"-XPOST-d'{"abc":123,"bcd":"nihao"}......
  • 2023最新版——新手使用mybatis-plus 3.5.2并使用器代码生成器
    最新版——新手使用mybatis-plus3.5.2并使用器代码生成器第一步,pom文件引入依赖主要引入mybatis-plus和代码生成器需要使用的freemaker依赖<dependency> <groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</vers......
  • Linux使用源安装nginx
    1.安装依赖包##一键安装上面四个依赖yum-yinstallgcczlibzlib-develpcre-developensslopenssl-devel2.下载并解压安装包//创建一个文件夹cd/usr/localmkdirnginxcdnginx//下载tar包wgethttp://nginx.org/download/nginx-1.21.6.tar.gztar-xvfnginx-1.21.......