我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何Spring Boot中使用MockMvc对象进行单元测试

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何Spring Boot中使用MockMvc对象进行单元测试

这期内容当中小编将会给大家带来有关如何Spring Boot中使用MockMvc对象进行单元测试,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

Spring测试框架提供MockMvc对象,可以在不需要客户端-服务端请求的情况下进行MVC测试,完全在服务端这边就可以执行Controller的请求,跟启动了测试服务器一样。

测试开始之前需要建立测试环境,setup方法被@Before修饰。通过MockMvcBuilders工具,使用WebApplicationContext对象作为参数,创建一个MockMvc对象。

MockMvc对象提供一组工具函数用来执行assert判断,都是针对web请求的判断。这组工具的使用方式是函数的链式调用,允许程序员将多个测试用例链接在一起,并进行多个判断。在这个例子中我们用到下面的一些工具函数:

perform(get(...))建立web请求。在我们的第三个用例中,通过MockMvcRequestBuilder执行GET请求。

andExpect(...)可以在perform(...)函数调用后多次调用,表示对多个条件的判断,这个函数的参数类型是ResultMatcher接口,在MockMvcResultMatchers这这个类中提供了很多返回ResultMatcher接口的工具函数。这个函数使得可以检测同一个web请求的多个方面,包括HTTP响应状态码(response status),响应的内容类型(content type),会话中存放的值,检验重定向、model或者header的内容等等。这里需要通过第三方库json-path检测JSON格式的响应数据:检查json数据包含正确的元素类型和对应的值,例如jsonPath("$.name").value("中文测试")用于检查在根目录下有一个名为name的节点,并且该节点对应的值是“testuser”。

本文对rest api的开发不做详细描述,如需了解可以参考 Spring Boot实战之Rest接口开发及数据库基本操作

修改pom.xml,添加依赖库json-path,用于检测JSON格式的响应数据

<dependency>   <groupId>com.jayway.jsonpath</groupId>   <artifactId>json-path</artifactId> </dependency>

 2、添加用户数据模型UserInfo.java

package com.xiaofangtech.sunt.bean;  import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import javax.validation.constraints.Size;  @Entity @Table(name="t_userinfo") public class UserInfo {   @Id    @GeneratedValue(strategy = GenerationType.AUTO)    private Long id;   @Size(min=0, max=32)   private String name;      private Integer age;   @Size(min=0, max=255)   private String address;    public Long getId() {     return id;   }    public void setId(Long id) {     this.id = id;   }    public String getName() {     return name;   }    public void setName(String name) {     this.name = name;   }    public Integer getAge() {     return age;   }    public void setAge(Integer age) {     this.age = age;   }    public String getAddress() {     return address;   }    public void setAddress(String address) {     this.address = address;   } }

添加控制器UserController.java,用于实现对用户的增删改查

package com.xiaofangtech.sunt.controller;  import java.util.List;  import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.jpa.repository.Modifying; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController;  import com.xiaofangtech.sunt.bean.UserInfo; import com.xiaofangtech.sunt.repository.UserInfoRepository; import com.xiaofangtech.sunt.utils.*;  @RestController  @RequestMapping("user") public class UserController {   @Autowired    private UserInfoRepository userRepositoy;         @RequestMapping(value="getuser", method=RequestMethod.GET)    public Object getUser(Long id)    {      UserInfo userEntity = userRepositoy.findOne(id);      ResultMsg resultMsg = new ResultMsg(ResultStatusCode.OK.getErrcode(), ResultStatusCode.OK.getErrmsg(), userEntity);      return resultMsg;    }         @RequestMapping(value="getalluser", method=RequestMethod.GET)    public Object getUserList()   {     List<UserInfo> userEntities = (List<UserInfo>) userRepositoy.findAll();     ResultMsg resultMsg = new ResultMsg(ResultStatusCode.OK.getErrcode(), ResultStatusCode.OK.getErrmsg(), userEntities);      return resultMsg;   }         @Modifying   @RequestMapping(value="adduser", method=RequestMethod.POST)   public Object addUser(@RequestBody UserInfo userEntity)   {     userRepositoy.save(userEntity);      ResultMsg resultMsg = new ResultMsg(ResultStatusCode.OK.getErrcode(), ResultStatusCode.OK.getErrmsg(), userEntity);      return resultMsg;    }         @Modifying    @RequestMapping(value="updateuser", method=RequestMethod.PUT)    public Object updateUser(@RequestBody UserInfo userEntity)    {      UserInfo user = userRepositoy.findOne(userEntity.getId());     if (user != null)      {        user.setName(userEntity.getName());       user.setAge(userEntity.getAge());       user.setAddress(userEntity.getAddress());       userRepositoy.save(user);     }     ResultMsg resultMsg = new ResultMsg(ResultStatusCode.OK.getErrcode(), ResultStatusCode.OK.getErrmsg(), user);      return resultMsg;   }         @Modifying    @RequestMapping(value="deleteuser", method=RequestMethod.DELETE)     public Object deleteUser(Long id)    {      try     {       userRepositoy.delete(id);      }     catch(Exception exception)     {            }     ResultMsg resultMsg = new ResultMsg(ResultStatusCode.OK.getErrcode(), ResultStatusCode.OK.getErrmsg(), null);      return resultMsg;    }  }

修改测试类,添加对以上接口进行单元测试的测试用例

package com.xiaofangtech.sunt;  import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.http.MediaType; 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.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext;  import com.fasterxml.jackson.databind.ObjectMapper; import com.xiaofangtech.sunt.bean.UserInfo;  import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.hamcrest.Matchers.*; //这是JUnit的注解,通过这个注解让SpringJUnit4ClassRunner这个类提供Spring测试上下文。 @RunWith(SpringJUnit4ClassRunner.class) //这是Spring Boot注解,为了进行集成测试,需要通过这个注解加载和配置Spring应用上下 @SpringApplicationConfiguration(classes = SpringJUnitTestApplication.class) @WebAppConfiguration public class SpringJUnitTestApplicationTests {    @Autowired   private WebApplicationContext context;      private MockMvc mockMvc;     @Before    public void setupMockMvc() throws Exception {      mockMvc = MockMvcBuilders.webAppContextSetup(context).build();    }            @Test   public void testAddUser() throws Exception   {     //构造添加的用户信息     UserInfo userInfo = new UserInfo();     userInfo.setName("testuser2");     userInfo.setAge(29);     userInfo.setAddress("北京");     ObjectMapper mapper = new ObjectMapper();          //调用接口,传入添加的用户参数     mockMvc.perform(post("/user/adduser")         .contentType(MediaType.APPLICATION_JSON_UTF8)         .content(mapper.writeValueAsString(userInfo)))     //判断返回值,是否达到预期,测试示例中的返回值的结构如下{"errcode":0,"errmsg":"OK","p2pdata":null}     .andExpect(status().isOk())     .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))     //使用jsonPath解析返回值,判断具体的内容     .andExpect(jsonPath("$.errcode", is(0)))     .andExpect(jsonPath("$.p2pdata", notNullValue()))     .andExpect(jsonPath("$.p2pdata.id", not(0)))     .andExpect(jsonPath("$.p2pdata.name", is("testuser2")));   }         @Test   public void testUpdateUser() throws Exception   {     //构造添加的用户信息,更新id为2的用户的用户信息     UserInfo userInfo = new UserInfo();     userInfo.setId((long)2);     userInfo.setName("testuser");     userInfo.setAge(26);     userInfo.setAddress("南京");     ObjectMapper mapper = new ObjectMapper();          mockMvc.perform(put("/user/updateuser")         .contentType(MediaType.APPLICATION_JSON_UTF8)         .content(mapper.writeValueAsString(userInfo)))     //判断返回值,是否达到预期,测试示例中的返回值的结构如下     //{"errcode":0,"errmsg":"OK","p2pdata":null}     .andExpect(status().isOk())     .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))     .andExpect(jsonPath("$.errcode", is(0)))     .andExpect(jsonPath("$.p2pdata", notNullValue()))     .andExpect(jsonPath("$.p2pdata.id", is(2)))     .andExpect(jsonPath("$.p2pdata.name", is("testuser")))     .andExpect(jsonPath("$.p2pdata.age", is(26)))     .andExpect(jsonPath("$.p2pdata.address", is("南京")));   }         @Test   public void testGetUser() throws Exception   {     mockMvc.perform(get("/user/getuser?id=2"))     .andExpect(status().isOk())     .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))     .andExpect(jsonPath("$.errcode", is(0)))     .andExpect(jsonPath("$.p2pdata", notNullValue()))     .andExpect(jsonPath("$.p2pdata.id", is(2)))     .andExpect(jsonPath("$.p2pdata.name", is("testuser")))     .andExpect(jsonPath("$.p2pdata.age", is(26)))     .andExpect(jsonPath("$.p2pdata.address", is("南京")));   }       @Test   public void testGetUsers() throws Exception   {     mockMvc.perform(get("/user/getalluser"))     .andExpect(status().isOk())     .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))     .andExpect(jsonPath("$.errcode", is(0)))     .andExpect(jsonPath("$.p2pdata", notNullValue()));   } }

上述就是小编为大家分享的如何Spring Boot中使用MockMvc对象进行单元测试了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何Spring Boot中使用MockMvc对象进行单元测试

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何Spring Boot中使用MockMvc对象进行单元测试

这期内容当中小编将会给大家带来有关如何Spring Boot中使用MockMvc对象进行单元测试,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Spring测试框架提供MockMvc对象,可以在不需要客户端
2023-05-31

如何使用MockMvc进行controller层单元测试

这篇文章主要介绍了如何使用MockMvc进行controller层单元测试,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。看代码吧~package com.ieou.ms_ba
2023-06-15

如何使用单元测试框架对 Golang 函数进行测试?

go 中使用单元测试框架进行单元测试:导入 testing 包。编写以 test 为前缀的单元测试函数。使用断言函数(如 assertequal())验证测试结果。运行单元测试(go test),验证函数的正确性。如何使用单元测试框架对 G
如何使用单元测试框架对 Golang 函数进行测试?
2024-04-16

如何使用 PHP 进行单元测试?

单元测试检查软件的最小构成部分(如函数、方法),php 可通过 phpunit 框架进行单元测试。首先安装 phpunit,然后创建测试类(扩展自 testcase),再编写以 "test" 开头的测试方法,使用 assertequals
如何使用 PHP 进行单元测试?
2024-04-19

Android中如何使用JUnit进行单元测试

在我们日常开发android app的时候,需要不断地进行测试,所以使用JUnit测试框架显得格外重要,学会JUnit可以加快应用的开发周期。Android中建立JUnit测试环境有以下两种方法。一、直接在需要被测试的工程中新建测试类集成步
2022-06-06

如何对Entity Framework Core进行单元测试

这篇文章主要介绍如何对Entity Framework Core进行单元测试,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、引言我们先来讲解如何对EntityFrameworkCore进行单元测试,这里我们使用内存
2023-06-29

使用Junit对Android应用进行单元测试

在本文中,你将会学习到如何在Eclipse中创建Android JUnit的单元测试工程以及在不同的条件下创建及运行自动测试用例。准备工作本文假设读者已经有一定的Android基础知识,并且已经安装了Eclipse和Android SDK等
2022-06-06

Android中使用Junit进行单元测试

不管我们在学习还是在开发的时候,都会用到测试,在Android中进行的Junit单元工具测试需要创建一个类去继承于AndroidTestCase类,同时还需要在主配置文件AndroidManifest.xml中配置相关的信息创建Test类继
2022-06-06

C#中如何使用单元测试框架进行自动化测试

C#中如何使用单元测试框架进行自动化测试引言:在软件开发过程中,自动化测试是一个非常重要的环节。通过编写和运行测试代码,可以帮助我们验证和确保代码的正确性和稳定性。在C#开发中,我们可以使用单元测试框架来实现自动化测试。本文将介绍C#中常用
2023-10-22

如何使用 Go 标准库进行单元测试

go 标准库通过 testing 包提供了单元测试功能,只需创建 _test.go 文件并编写测试函数即可。测试函数使用断言函数,如 assertequal 和 asserttrue,比较预期结果和实际结果。测试通过或失败的信息将通过 go
如何使用 Go 标准库进行单元测试
2024-04-30

如何使用 PHPUnit 进行 PHP 函数单元测试?

要进行 php 函数单元测试,可以使用 phpunit,步骤如下:创建测试类文件,扩展 phpunit\framework\testcase。为要测试的函数编写以 "test" 开头的测试方法。使用 assert* 断言验证函数输出。运行
如何使用 PHPUnit 进行 PHP 函数单元测试?
2024-04-17

如何对Android系统手机进行单元测试

如何进行Android单元测试 外面加入:MISSION android:name="android.permission.RUN_INSTRUMENTATION" />android:label="Test for my app"/>编写
2022-06-06

使用Spring Boot如何对Mybatis进行整合

今天就跟大家聊聊有关使用Spring Boot如何对Mybatis进行整合,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。依赖配置结合前面的内容,这里我们要嵌入数据库的操作,这里以操作
2023-05-31

Android应用开发中如何进行单元测试

本文主要和大家分享如何在Android应用开发过程中如何进行单元测试,个人在做项目的过程中,觉得单元测试很有必要,以保证我们编写程序的正确性。下面我们先大概了解下单元测试,以及单元测试的作用。 单元测试(又称为模块测试)是针对程序模块(
2022-06-06

C++中怎么使用CppUnit进行单元测试

这篇文章主要讲解了“C++中怎么使用CppUnit进行单元测试”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中怎么使用CppUnit进行单元测试”吧!如果使用VC6,那么直接用VC6打
2023-06-17

ASP.NET Core项目如何使用xUnit进行单元测试

小编给大家分享一下ASP.NET Core项目如何使用xUnit进行单元测试,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、前言在以前的.NET Framewo
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录