详解Spring MVC如何测试Controller(使用springmvc mock测试)

详解Spring MVC如何测试Controller(使用springmvc mock测试),第1张

概述在springmvc中一般的测试用例都是测试service层,今天我来演示下如何使用springmvcmock直接测试controller层代码。

在springmvc中一般的测试用例都是测试service层,今天我来演示下如何使用springmvc mock直接测试controller层代码。

1.什么是mock测试?

mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。

2.为什么要使用mock测试?

使用Mock O bject进行测试,主要是用来模拟那些在应用中不容易构造(如httpServletRequest必须在Servlet容器中才能构造出来)或者比较复杂的对象(如JDBC中的ResultSet对象)从而使测试顺利进行的工具。

3.常用注解

RunWith(SpringJUnit4ClassRunner.class): 表示使用Spring Test组件进行单元测试;

WebAppConfiguratio: 使用这个annotation会在跑单元测试的时候真实的启一个web服务,然后开始调用Controller的Rest API,待单元测试跑完之后再将web服务停掉;

ContextConfiguration: 指定Bean的配置文件信息,可以有多种方式,这个例子使用的是文件路径形式,如果有多个配置文件,可以将括号中的信息配置为一个字符串数组来表示;

4.安装测试环境

spring mvc测试框架提供了两种方式,独立安装和集成Web环境测试(此种方式并不会集成真正的web环境,而是通过相应的Mock API进行模拟测试,无须启动服务器)。

 独立安装测试方式

mockmvcBuilders.standalonesetup(Object... controllers):通过参数指定一组控制器,这样就不需要从上下文获取了;

主要是两个步骤:

(1)首先自己创建相应的控制器,注入相应的依赖

(2)通过mockmvcBuilders.standalonesetup模拟一个Mvc测试环境,通过build得到一个mockmvc

代码如下:

package com.xfs.test;import org.junit.Assert;import org.junit.Before;import org.junit.Test;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.result.mockmvcResultMatchers;import org.springframework.test.web.servlet.setup.mockmvcBuilders;import com.alibaba.fastJson.JsON;import com.alibaba.fastJson.JsONObject;import com.xfs.web.controller.APIController;/** * 独立安装测试方式 springmvc mock测试 * * @author admin * * 2017年11月23日 上午10:39:49 */public class TestAPIOne {  private mockmvc mockmvc;  @Before  public voID setUp() {    APIController APIController = new APIController();    mockmvc = mockmvcBuilders.standalonesetup(APIController).build();  }  @Test  public voID testGetSequence() {    try {      MvcResult mvcResult = mockmvc.perform(mockmvcRequestBuilders.post("/API/getSequence"))                .andExpect(mockmvcResultMatchers.status().is(200))                .andDo(mockmvcResultHandlers.print())                .andReturn();      int status = mvcResult.getResponse().getStatus();      System.out.println("请求状态码:" + status);      String result = mvcResult.getResponse().getContentAsstring();      System.out.println("接口返回结果:" + result);      JsONObject resultObj = JsON.parSEObject(result);      // 判断接口返回Json中success字段是否为true      Assert.assertTrue(resultObj.getBooleanValue("success"));    } catch (Exception e) {      e.printstacktrace();    }  }} 

请求结果如下:

集成Web环境方式

mockmvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的mockmvc;

主要是三个步骤:

(1)@WebAppConfiguration:测试环境使用,用来表示测试环境使用的ApplicationContext将是WebApplicationContext类型的;value指定web应用的根

(2)通过@autowired WebApplicationContext wac:注入web环境的ApplicationContext容器

(3)然后通过mockmvcBuilders.webAppContextSetup(wac).build()创建一个mockmvc进行测试

代码如下:

package com.xfs.test;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.mock.web.MockhttpSession;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;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.result.mockmvcResultMatchers;import org.springframework.test.web.servlet.setup.mockmvcBuilders;import org.springframework.web.context.WebApplicationContext;import com.alibaba.fastJson.JsON;import com.alibaba.fastJson.JsONObject;/** * 集成Web环境方式 springmvc mock测试 * * @author admin * * 2017年11月23日 上午11:12:43 */@RunWith(JUnit4ClassRunner.class)@WebAppConfiguration@ContextConfiguration(locations = { "classpath*:spring/*.xml" })public class TestAPITwo extends AbstractJUnit4SpringContextTests {  @autowired  public WebApplicationContext wac;  public mockmvc mockmvc;  public MockhttpSession session;  @Before  public voID before() throws Exception {    mockmvc = mockmvcBuilders.webAppContextSetup(wac).build();  }  @Test  public voID testGetSequence() {    try {      MvcResult mvcResult = mockmvc.perform(mockmvcRequestBuilders.post("/API/getSequence"))                .andExpect(mockmvcResultMatchers.status().is(200))                .andDo(mockmvcResultHandlers.print())                .andReturn();      int status = mvcResult.getResponse().getStatus();      System.out.println("请求状态码:" + status);      String result = mvcResult.getResponse().getContentAsstring();      System.out.println("接口返回结果:" + result);      JsONObject resultObj = JsON.parSEObject(result);      // 判断接口返回Json中success字段是否为true      Assert.assertTrue(resultObj.getBooleanValue("success"));    } catch (Exception e) {      e.printstacktrace();    }  }}

运行结果和上面独立测试时候一样。

总结:

整个过程:

1、mockmvc.perform执行一个请求;

2、mockmvcRequestBuilders.get("/user/1")构造一个请求

3、ResultActions.andExpect添加执行完成后的断言

4、ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情,比如此处使用mockmvcResultHandlers.print()输出整个响应结果信息。

5、ResultActions.andReturn表示执行完成后返回相应的结果。

整个测试过程非常有规律:

1、准备测试环境

2、通过mockmvc执行请求

3、添加验证断言

4、添加结果处理器

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

6、卸载测试环境

参考: spring-mvc-test-framework

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的详解Spring MVC如何测试Controller(使用springmvc mock测试)全部内容,希望文章能够帮你解决详解Spring MVC如何测试Controller(使用springmvc mock测试)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1224145.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存