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日
    浏览(14)
  • Spring Test中使用MockMvc进行上传文件单元测试时,报NullPointerException

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

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

    SpringBoot 如何使用 MockMvc 进行 Web 集成测试

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

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

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

    2024年01月17日
    浏览(10)
  • 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日
    浏览(10)
  • 单元测试实战(一)Controller 的测试

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

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

    Spring Boot 单元测试(Controller测试与Service测试)

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

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

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

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

    基于Junit4+Mockito+PowerMock实现Controller+Service的单元测试

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

    2024年02月14日
    浏览(12)
  • SpringBoot 使用Mock单元测试

    SpringBoot 使用Mock单元测试

    测试一般分为两种黑盒测试和白盒测试。         黑盒测试又称为 功能测试 或 数据驱动测试 ,测试过程中,程序看作成一个黑色盒子,看不到盒子内部代码结构。         白盒测试又称为 结构测试 或 逻辑驱动测试 ,测试过程中,程序看作一个透明盒子,能够看清

    2024年03月20日
    浏览(8)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包