`

MockMvc测试spring mvc controller

 
阅读更多

转自:https://www.cnblogs.com/xiaohunshi/p/5706943.html

概述

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

简介

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

运行配置

用到的注解

  • RunWith(SpringJUnit4ClassRunner.class): 表示使用Spring Test组件进行单元测试;
  • WebAppConfiguration: 使用这个Annotate会在跑单元测试的时候真实的启一个web服务,然后开始调用Controller的Rest API,待单元测试跑完之后再将web服务停掉;
  • ContextConfiguration: 指定Bean的配置文件信息,可以有多种方式,这个例子使用的是文件路径形式,如果有多个配置文件,可以将括号中的信息配置为一个字符串数组来表示;

基本框架

/**
 * 演示MockMVC使用
 * @author zhanyongzhi
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:**web-config.xml")
@WebAppConfiguration
public class MockMvcTest {
    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }
}

测试逻辑

  校验Controller处理之后,请求是否为成功状态,返回的内容是否包含了:"{'foo':'bar'}"字符串。

1 mockMvc调用perform,调用controller的业务处理逻辑
2 perform返回ResultActions,返回操作结果,通过ResultActions,提供了统一的验证方式。
3 使用StatusResultMatchers对请求结果进行验证
4 使用ContentResultMatchers对请求返回的内容进行验证

/**
 * 演示MockMVC使用
 * @author zhanyongzhi
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:**web-config.xml")
@WebAppConfiguration
public class MockMvcTest {
    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

    @Test
    public void demo() throws Exception {
        mockMvc.perform(get("/demo/test").accept(MediaType.parseMediaType("application/json;charset=UTF-8")))
               .andExpect(status().isOk())
               .andExpect(content().contentType("application/json;charset=UTF-8"))
               .andExpect(content().json("{'foo':'bar'}"));
    }
}

另一个案例

先看一个测试例子1:

复制代码
  @Test
    public void createIncotermSuccess() throws Exception {
        IncotermTo createdIncoterm = new IncotermTo();
        createdIncoterm.setId(new IncotermId(UUID.fromString("6305ff33-295e-11e5-ae37-54ee7534021a")));
        createdIncoterm.setCode("EXW");
        createdIncoterm.setDescription("code exw");
        createdIncoterm.setLocationQualifier(LocationQualifier.DEPARTURE);

        when(inventoryService.create(any(IncotermTo.class))).thenReturn(createdIncoterm);

        mockMvc.perform(post("/secured/resources/incoterms/create").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)
                .content("{\"code\" : \"EXW\", \"description\" : \"code exw\", \"locationQualifier\" : \"DEPARTURE\"}".getBytes()))
                //.andDo(print())
                .andExpect(status().isOk())
                .andExpect(jsonPath("id.value").exists())
                .andExpect(jsonPath("id.value").value("6305ff33-295e-11e5-ae37-54ee7534021a"))
                .andExpect(jsonPath("code").value("EXW"));
    }
复制代码

perform:执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理;
andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确;
andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台;
andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理;

 

看一个具体的例子2:

复制代码
    @Test  
    public void testView() throws Exception {  
        MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/user/1"))  
                .andExpect(MockMvcResultMatchers.view().name("user/view"))  
                .andExpect(MockMvcResultMatchers.model().attributeExists("user"))  
                .andDo(MockMvcResultHandlers.print())  
                .andReturn();  
          
        Assert.assertNotNull(result.getModelAndView().getModel().get("user"));  
    }  
复制代码

整个过程:
1、mockMvc.perform执行一个请求;
2、MockMvcRequestBuilders.get("/user/1")构造一个请求
3、ResultActions.andExpect添加执行完成后的断言
4、ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情,比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。
5、ResultActions.andReturn表示执行完成后返回相应的结果。

整个测试过程非常有规律:
1、准备测试环境
2、通过MockMvc执行请求
3.1、添加验证断言
3.2、添加结果处理器
3.3、得到MvcResult进行自定义断言/进行下一步的异步请求

4、卸载测试环境 
分享到:
评论

相关推荐

    使用Rest Assured和Mockmvc进行Spring mvc集成测试.zip

    通过这个项目,你可以学习到如何构建一个完整的Spring MVC集成测试环境,理解如何使用`Rest Assured`和`MockMvc`进行端到端测试,以及如何编写高质量的测试代码来确保你的应用在各种场景下都能正常工作。

    spring MVC junit 单元测试(controller)

    在Spring MVC中,我们可以利用Spring的TestContext框架和MockMVC库来模拟HTTP请求,对Controller进行隔离测试。 进行Spring MVC Controller的单元测试,我们需要以下步骤: 1. **配置测试环境**:引入Spring Test...

    spring mvc的简单单元测试

    Spring MVC 是一个强大的Java web开发框架,用于构建可维护、可扩展的...总之,通过正确使用JUnit、Mockito、Spring Test以及MockMVC,我们可以编写出全面、有效的Spring MVC单元测试,确保代码质量并降低潜在的bug。

    最全最经典spring-mvc教程

    Spring MVC提供了MockMVC,可以在不依赖服务器的情况下进行单元测试和集成测试。 这个"最全最经典spring-mvc教程"应该会详细讲解上述所有概念,并可能通过实例演示如何配置、创建和调试Spring MVC项目。对于想要...

    开发Spring MVC应用程序补充—程序源码下载.rar_spring_spring mvc_spring mvc 源码_sp

    9. **单元测试**:利用MockMVC进行Controller层面的单元测试。 10. **源码分析**:通过对Spring MVC源码的阅读和理解,学习其内部工作原理,提升问题排查和性能调优的能力。 以上就是基于提供的信息推测的Spring ...

    spring mvc demo

    可以使用 MockMVC 进行 Spring MVC 的模拟测试,对于 Mybatis,可以通过 JUnit 和 Mockito 测试数据库操作。 通过这种整合,开发者可以在 Spring MVC 的控制层直接注入 Mybatis 的 DAO 对象,简化了代码的编写,...

    spring mvc经典入门案例

    `springMvcCommentTest` 这个文件可能是测试类,用于测试 Spring MVC 控制器的行为。在 Spring 中,我们可以使用 `MockMvc` 工具进行单元测试,模拟 HTTP 请求并验证响应结果。 6. **实战案例** - 创建一个简单的...

    spring MVC_快速入门

    Spring MVC提供了MockMvc工具,可以在不启动服务器的情况下进行单元测试和集成测试。 这个“spring MVC_快速入门”文档可能涵盖了以上部分或全部内容,旨在帮助初学者快速理解Spring MVC的工作原理和基本用法。...

    Spring MVC Cookbook(PACKT,2016).pdf

    13. **测试Spring MVC应用**:理解如何编写JUnit测试用例,使用MockMVC模拟HTTP请求,以及进行集成测试。 14. **Spring Security**:如果书中涉及,会讲解如何集成Spring Security进行身份验证和授权,保护应用程序...

    junit针对spring mvc三层测试

    本测试着重关注Spring MVC架构中的三层:表现层(Presentation Layer)、业务层(Business Logic Layer)和服务数据访问层(Service and Data Access Layer)。下面我们将详细探讨如何使用JUnit进行针对这三层的测试...

    Spring-MVC-step-by-step.zip_Java MVC spring_Java spring mvc_sp

    Spring MVC提供MockMvc工具,可以在不依赖Web服务器的情况下对Controller进行单元测试,方便快捷。 十二、实践操作 本教程中的"Spring-MVC-step-by-step.pdf"文件将详细介绍上述概念,并通过实例代码演示如何配置和...

    spring MVC文档

    首先,Spring MVC的组件主要包括DispatcherServlet、Controller、Model、View和ViewResolver等。DispatcherServlet作为入口点,负责接收所有HTTP请求并分发到相应的处理器。Controller接口或基于注解的控制器类(如@...

    spring mvc 3_demo

    Spring MVC提供`MockMvc`类用于对控制器进行单元测试,模拟HTTP请求并验证响应。 这个"Spring MVC 3_demo"项目是学习和理解Spring MVC 3中注解驱动开发的绝佳起点。通过实践这些概念,你可以更深入地了解Spring ...

    Spring MVCSpring MVC基础.ppt

    10. **测试支持**:Spring MVC提供了MockMVC工具,方便进行单元测试和集成测试,确保应用的正确性和性能。 总的来说,Spring MVC以其灵活性、可扩展性和易用性,成为了Java Web开发中的首选框架。通过理解并熟练...

    spring mvc

    #### 十三、JUnit 单元测试 Spring MVC 控制器 为了确保控制器的正确性,可以编写 JUnit 测试用例来进行单元测试。通常会使用 Spring Test 模块提供的 `MockMvc` 类来模拟 HTTP 请求,并验证控制器的行为。 #### ...

    精通Spring MVC4 电子版_springmuv_

    12. **测试**:Spring MVC提供了MockMVC工具,用于单元测试和集成测试控制器,模拟HTTP请求并验证响应。 通过学习《精通Spring MVC4 电子版》,开发者将能够掌握Spring MVC的核心概念,熟练运用它来构建高效、可...

    第一章 Spring MVC 你好spring mvc

    例如,MockMvc 类可以模拟 HTTP 请求并验证 Controller 的行为,而 WebApplicationContextUtils 则可以帮助在测试环境中加载 Spring 上下文。 **总结** Spring MVC 是 Spring 框架中用于构建 Web 应用的强大工具,...

    Spring mvc showcase

    Spring MVC提供了`MockMvc`类,允许在不依赖服务器环境的情况下进行单元测试和集成测试。 在"Spring MVC Showcase"项目中,你可以看到这些概念如何在实践中应用,通过阅读源码和运行示例,加深对Spring MVC的理解...

    Spring.MVC学习指南.pdf

    - 使用MockMvc进行Controller的单元测试,模拟HTTP请求并验证响应结果。 以上是Spring MVC的基本知识点,这份学习指南可能会详细讲解这些内容,并提供实际案例和最佳实践,帮助读者从基础到高级全面掌握Spring MVC...

Global site tag (gtag.js) - Google Analytics