SpringBoot使用MockMVC单元测试Controller

这篇具有很好参考价值的文章主要介绍了SpringBoot使用MockMVC单元测试Controller。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如启动速度慢,测试验证不方便,依赖网络环境等,这样会导致测试无法进行,为了可以对Controller进行测试,可以通过引入MockMVC进行解决

MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。

MockMvcBuilder是用来构造MockMvc的构造器,其主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,分别对应两种测试方式,即独立安装集成Web环境测试(此种方式并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)。对于我们来说直接使用静态工厂MockMvcBuilders创建即可。

下面就写一个简单的案例,告诉你是如何使用MockMvc进行Controller测试的

01 创建项目

创建一个Maven项目(springboot-junit),并配置pom.xml,参照下面代码:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 
 <groupId>org.lvgang</groupId>
 <artifactId>springboot-junit</artifactId>
 <version>1.0-SNAPSHOT</version>
 <packaging>jar</packaging>
 
 <name>springboot-junit</name>
 <url>http://maven.apache.org</url>
 
 <parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.1.3.RELEASE</version>
 </parent>
 
 <properties>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>
 
 <dependencies>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
   </dependency>
 </dependencies>
 
</project>

创建一个Controller类,我们在后面就测试空上Controller

SpringBoot使用MockMVC单元测试Controller,spring boot,单元测试,后端,测试工具,自动化测试,python,程序员

02 编写测试类

下面我们就是编写测试类了:

package org.lvgang;
 
import org.junit.Assert;
 
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.context.SpringBootTest;
 
import org.springframework.http.MediaType;
 
import org.springframework.test.context.junit4.SpringRunner;
 
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.request.MockMvcRequestBuilders;
 
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
 
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
import org.springframework.web.context.WebApplicationContext;
 
 
 
 
 
//SpringBoot1.4版本之前用的是SpringJUnit4ClassRunner.class
 
@RunWith(SpringRunner.class)
 
//SpringBoot1.4版本之前用的是@SpringApplicationConfiguration(classes = Application.class)
 
@SpringBootTest(classes = App.class)
 
//测试环境使用,用来表示测试环境使用的ApplicationContext将是WebApplicationContext类型的
 
@WebAppConfiguration
 
public class HelloControllerTest {    
 
   @Autowired
   private WebApplicationContext webApplicationContext;    
 
   private MockMvc mockMvc;    
 
   
 
   @Before
   public void setUp() throws Exception{      
       //MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc
       mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();//建议使用这种
   }    
 
 
 
 
 
   @Test
   public void getHello() throws Exception{        
 
       /**
        * 1、mockMvc.perform执行一个请求。
        * 2、MockMvcRequestBuilders.get("XXX")构造一个请求。
        * 3、ResultActions.param添加请求传值
        * 4、ResultActions.accept(MediaType.TEXT_HTML_VALUE))设置返回类型
        * 5、ResultActions.andExpect添加执行完成后的断言。
        * 6、ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情
        *   比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。
        * 5、ResultActions.andReturn表示执行完成后返回相应的结果。
       */
 
       MvcResult mvcResult= mockMvc.perform(MockMvcRequestBuilders.get("/")
               .param("name","lvgang")
               .accept(MediaType.TEXT_HTML_VALUE))              
 
              // .andExpect(MockMvcResultMatchers.status().isOk())             //等同于Assert.assertEquals(200,status);
              // .andExpect(MockMvcResultMatchers.content().string("hello lvgang"))    //等同于 Assert.assertEquals("hello lvgang",content);
               .andDo(MockMvcResultHandlers.print())
               .andReturn();        
 
       int status=mvcResult.getResponse().getStatus();                 //得到返回代码
       String content=mvcResult.getResponse().getContentAsString();    //得到返回结果
       Assert.assertEquals(200,status);                        //断言,判断返回代码是否正确
       Assert.assertEquals("hello lvgang",content);            //断言,判断返回的值是否正确
   }
}

整个测试过程如下:

  • 准备测试环境

  • 通过MockMvc执行请求

  • 添加验证断言

  • 添加结果处理器

  • 得到MvcResult进行自定义断言/进行下一步的异步请求

  • 卸载测试环境

03 测试结果

通过执行HelloControllerTest,得到以下结果:

SpringBoot使用MockMVC单元测试Controller,spring boot,单元测试,后端,测试工具,自动化测试,python,程序员

并且把整个返回结果都打印到了Console中

MockHttpServletRequest:
     HTTP Method = GET
     Request URI = /
      Parameters = {name=[lvgang]}
         Headers = {Accept=[text/html]}
 
Handler:
            Type = org.lvgang.HelloController
          Method = public java.lang.String org.lvgang.HelloController.hello(java.lang.String)
 
Async:
   Async started = false
   Async result = null
 
Resolved Exception:
            Type = null
 
ModelAndView:
      View name = null
       View = null
       Model = null
 
FlashMap:
      Attributes = null
 
 
 
MockHttpServletResponse:
          Status = 200
   Error message = null
         Headers = {Content-Type=[text/html;charset=UTF-8], Content-Length=[12]}
    Content type = text/html;charset=UTF-8
            Body = hello lvgang
   Forwarded URL = null
  Redirected URL = null
         Cookies = []

通过以上代码,我们就完成了一个简单的案例。

附:

RequestBuilder/MockMvcRequestBuilders:

在上面的测试类中,我们用到了这么一个类MockMvcRequestBuilders用来构建请求的,此类有以下主要的API:

MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根据uri模板和uri变量值得到一个GET请求方式的MockHttpServletRequestBuilder;如get(/user/{id}, 1L);
 
MockHttpServletRequestBuilder post(String urlTemplate, Object... urlVariables):同get类似,但是是POST方法;
 
MockHttpServletRequestBuilder put(String urlTemplate, Object... urlVariables):同get类似,但是是PUT方法;
 
MockHttpServletRequestBuilder delete(String urlTemplate, Object... urlVariables) :同get类似,但是是DELETE方法;
 
MockHttpServletRequestBuilder options(String urlTemplate, Object... urlVariables):同get类似,但是是OPTIONS方法;
 
MockHttpServletRequestBuilder request(HttpMethod httpMethod, String urlTemplate, Object... urlVariables):提供自己的Http请求方法及uri模板和uri变量,如上API都是委托给这个API;
 
MockMultipartHttpServletRequestBuilderfile Upload(String urlTemplate, Object... urlVariables):提供文件上传方式的请求,得到MockMultipartHttpServletRequestBuilder;
 
RequestBuilder asyncDispatch(final MvcResult mvcResult):创建一个从启动异步处理的请求的MvcResult进行异步分派的RequestBuilder;

MockMvcRequestBuilders通过方法得到两类Builder:

  • 一个是MockHttpServletRequestBuilder

  • 一个是MockMultipartHttpServletRequestBuilder (上传文件)

MockHttpServletRequestBuilder:

主要有以下API:

MockHttpServletRequestBuilder header(String name, Object... values)/MockHttpServletRequestBuilder headers(HttpHeaders httpHeaders):添加头信息;
 
MockHttpServletRequestBuilder contentType(MediaType mediaType):指定请求的contentType头信息;
 
MockHttpServletRequestBuilder accept(MediaType... mediaTypes)/MockHttpServletRequestBuilder accept(String... mediaTypes):指定请求的Accept头信息;
 
MockHttpServletRequestBuilder content(byte[] content)/MockHttpServletRequestBuilder content(String content):指定请求Body体内容;
 
MockHttpServletRequestBuilder param(String name,String... values):请求传入参数
 
MockHttpServletRequestBuilder cookie(Cookie... cookies):指定请求的Cookie;
 
MockHttpServletRequestBuilder locale(Locale locale):指定请求的Locale;
 
MockHttpServletRequestBuildercharacterEncoding(String encoding):指定请求字符编码;
 
MockHttpServletRequestBuilder requestAttr(String name, Object value) :设置请求属性数据;
 
MockHttpServletRequestBuilder sessionAttr(String name, Object value)/MockHttpServletRequestBuilder sessionAttrs(Map<string, object=""> sessionAttributes):设置请求session属性数据;
 
MockHttpServletRequestBuilder flashAttr(String name, Object value)/MockHttpServletRequestBuilder flashAttrs(Map<string, object=""> flashAttributes):指定请求的flash信息,比如重定向后的属性信息;
 
MockHttpServletRequestBuildersession(MockHttpSession session) :指定请求的Session;
 
MockHttpServletRequestBuilder principal(Principal principal) :指定请求的Principal;
 
MockHttpServletRequestBuilder contextPath(String contextPath) :指定请求的上下文路径,必须以“/”开头,且不能以“/”结尾;
 
MockHttpServletRequestBuilder pathInfo(String pathInfo) :请求的路径信息,必须以“/”开头;
 
MockHttpServletRequestBuilder secure(boolean secure):请求是否使用安全通道;
 
MockHttpServletRequestBuilder with(RequestPostProcessor postProcessor):请求的后处理器,用于自定义一些请求处理的扩展点;

MockMultipartHttpServletRequestBuilder:

继承自MockHttpServletRequestBuilder,又提供了如下API:

MockMultipartHttpServletRequestBuilder file(String name, byte[] content)/MockMultipartHttpServletRequestBuilder file(MockMultipartFile file):指定要上传的文件;

ResultActions:

调用MockMvc.perform(RequestBuilder requestBuilder)后将得到ResultActions,通过ResultActions完成如下三件事:

ResultActions andExpect(ResultMatcher matcher) :添加验证断言来判断执行请求后的结果是否是预期的;
ResultActions andDo(ResultHandler handler) :添加结果处理器,用于对验证成功后执行的动作,如输出下请求/结果信息用于调试;
MvcResult andReturn() :返回验证成功后的MvcResult;用于自定义验证/下一步的异步处理;

ResultMatcher/MockMvcResultMatchers:

ResultMatcher用来匹配执行完请求后的结果验证,其就一个match(MvcResult result)断言方法,如果匹配失败将抛出相应的异常

具体提供以下API:

HandlerResultMatchers handler():请求的Handler验证器,比如验证处理器类型/方法名;此处的Handler其实就是处理请求的控制器;
RequestResultMatchers request():得到RequestResultMatchers验证器;
ModelResultMatchers model():得到模型验证器;
ViewResultMatchers view():得到视图验证器;
FlashAttributeResultMatchers flash():得到Flash属性验证;
StatusResultMatchers status():得到响应状态验证器;
HeaderResultMatchers header():得到响应Header验证器;
CookieResultMatchers cookie():得到响应Cookie验证器;
ContentResultMatchers content():得到响应内容验证器;
JsonPathResultMatchers jsonPath(String expression, Object ... args)/ResultMatcher jsonPath(String expression, Matcher matcher):得到Json表达式验证器;
XpathResultMatchers xpath(String expression, Object... args)/XpathResultMatchers xpath(String expression, Map<string, string=""> namespaces, Object... args):得到Xpath表达式验证器;
ResultMatcher forwardedUrl(final String expectedUrl):验证处理完请求后转发的url(绝对匹配);
ResultMatcher forwardedUrlPattern(final String urlPattern):验证处理完请求后转发的url(Ant风格模式匹配,@since spring4);
ResultMatcher redirectedUrl(final String expectedUrl):验证处理完请求后重定向的url(绝对匹配);
ResultMatcher redirectedUrlPattern(final String expectedUrl):验证处理完请求后重定向的url(Ant风格模式匹配,@since spring4);

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

SpringBoot使用MockMVC单元测试Controller,spring boot,单元测试,后端,测试工具,自动化测试,python,程序员

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。SpringBoot使用MockMVC单元测试Controller,spring boot,单元测试,后端,测试工具,自动化测试,python,程序员
SpringBoot使用MockMVC单元测试Controller,spring boot,单元测试,后端,测试工具,自动化测试,python,程序员

 行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群:1150305204,里面有各种测试开发资料和技术可以一起交流哦。文章来源地址https://www.toymoban.com/news/detail-799401.html

到了这里,关于SpringBoot使用MockMVC单元测试Controller的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot对controller方法进行单元测试

    单元测试有助于验证程序的执行逻辑是否正确。controller层的单元测试,已经和接口测试很类似了。执行单元测试以前,需要添加测试依赖。 1. 生成一个单元测试基础类 注意需要添加的注解。 2. 没有参数的单元测试 执行单元测试,可以看到如下输出: 3. 有参数的单元测试(

    2024年02月11日
    浏览(78)
  • Spring Test中使用MockMvc进行上传文件单元测试时,报NullPointerException

    问题 : MockMvc peform在集成测试中返回nullPointerException 原因 : springboot-2.x版本以上,当你添加依赖spring_boot_starter_test后,可以在内部看到自带了jupiter测试核心模块,也就是 junit5,junit5(jupiter测试引擎)不再支持junit4(vintage测试引擎),在使用时自然不再需要spring来提供了,

    2024年02月14日
    浏览(45)
  • SpringBoot 如何使用 MockMvc 进行 Web 集成测试

    SpringBoot 是一个流行的 Java Web 开发框架,它提供了一些强大的工具和库,使得开发 Web 应用程序变得更加容易。其中之一是 MockMvc,它提供了一种测试 SpringBoot Web 应用程序的方式,可以模拟 HTTP 请求和响应的行为。 在本文中,我们将介绍 SpringBoot 中的 MockMvc,演示如何使用它

    2024年02月16日
    浏览(48)
  • Spring Boot 进行 MockMvc 单元测试的实例

    在Spring Boot应用程序中,使用MockMvc进行单元测试是一种有效的方式,可以验证控制器的行为和API的正确性。在这篇博客中,我们将介绍如何使用MockMvc对用户控制器(UserController)进行测试,该控制器涉及用户信息的增删改查操作。 UserController测试类 解释和注意事项 MockMvc的注

    2024年01月17日
    浏览(39)
  • spring boot 单元测试JUnit5使用MockMvc调用get请求,post请求,设置head请求头,解析返回值json和字符串

    spring boot 单元测试JUnit5使用MockMvc调用get/post接口 源码地址:https://gitcode.net/qq_39339588/springboot.git 1. 先准备一份controller,一会儿供测试调用 2. MockMvc测试调用get请求接口 两个注解说明 @SpringBootTest // 加测试类上,标明是测试的类 @AutoConfigureMockMvc // 支持对MockMvc对象的注入和配置,

    2024年02月14日
    浏览(53)
  • 单元测试实战(一)Controller 的测试

    为鼓励单元测试,特分门别类示例各种组件的测试代码并进行解说,供开发人员参考。 本文中的测试均基于JUnit5。 单元测试实战(一)Controller 的测试 单元测试实战(二)Service 的测试    单元测试实战(三)JPA 的测试     单元测试实战(四)MyBatis-Plus 的测试 单元测试实

    2024年02月04日
    浏览(74)
  • Spring Boot 单元测试(Controller测试与Service测试)

    🎈博客主页:🌈我的主页🌈 🎈欢迎点赞 👍 收藏 🌟留言 📝 欢迎讨论!👏 🎈本文由 【泠青沼~】 原创,首发于 CSDN🚩🚩🚩 🎈由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!🌠个人主页 @SpringBootTest相当于springMvc中单元测试中的

    2023年04月26日
    浏览(50)
  • Mock单元测试----对Controller层进行单独测试,不调用Service层

    前言:根据相关需求,需要对编写的代码进行逻辑检测以及功能的完整性,从而开始了单元测试之路。在编写的中间段时,突然被 不经过Service层直接测试Controller层 这个要求难住了。在我看来,单元测试除了Junit还是Junit,属实是学艺不精,之后接触了Mock,才发现Mock太牛逼了

    2024年02月05日
    浏览(42)
  • 基于Junit4+Mockito+PowerMock实现Controller+Service的单元测试

    一 导入的依赖 二 依赖版本 三 controller测试示例代码       controller         controllerTest         测试结果:覆盖率100%         带异常的Controller         带异常提示的ControllerTest         测试结果,覆盖率100%   三 service测试示例代码         service         serviceTest    

    2024年02月14日
    浏览(44)
  • SpringBoot中单元测试的使用

    会报错,我是报下面的错误 我的是因为之前的一个配置文件没有修改所以才出现的问题,我看网上的解决方法有下面的几种 spring-test坐标的版本较低,按我上面的pom坐标这么改便可以解决问题(这个是我第一次报错的时候改的),参考博文 在@SpringBootTest这个注解上面增加一

    2024年02月08日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包