Spring MVC接口如何使用模拟进行测试

  介绍

今天就跟大家聊聊有关Spring MVC接口如何使用模拟进行测试,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

<强> 1。前言

在Java开发中接触的开发者大多数不太注重对接口的测试,结果在联调对接中出现各种问题。也有的使用邮递员等工具进行测试,虽然在使用上没有什么问题,如果接口增加了权限测试起来就比较恶心了。所以建议在单元测试中测试接口,保证在交付前先自测接口的健壮性。今天就来分享一下胖哥在开发中是如何对Spring MVC接口进行测试的。

在开始前请务必确认添加了弹簧引导测试相关的组件,在最新的版本中应该包含以下依赖:

& lt; dependency>   & lt; groupId> org.springframework.boot   & lt; artifactId> spring-boot-starter-test   & lt; scope> test   & lt; exclusions>   & lt; exclusion>   & lt; groupId> org.junit.vintage   & lt; artifactId> junit-vintage-engine   & lt;/exclusion>   & lt;/exclusions>   & lt;/dependency>

本文是在春天引导2.3.4.RELEASE下进行的。

<强> 2。单独测试控制层

如果我们只需要对控制层接口(控制器)进行测试,且该接口不依赖@ service, @ component等注解声明的Spring Bean时,可以借助@WebMvcTest来启用只针对Web控制层的测试,例如

@WebMvcTest   类CustomSpringInjectApplicationTests {   @ autowired   MockMvc MockMvc;      @SneakyThrows   @Test   空白contextLoads () {   mockMvc.perform (MockMvcRequestBuilders.get (“/foo/map"))   .isOk .andExpect (ResultMatcher.matchAll(状态()(),   内容().contentType (MediaType.APPLICATION_JSON),   jsonPath (“.test"美元;,我(“hello"))))   .andDo (MockMvcResultHandlers.print ());   }      }

这种方式要快的多,它只加载了应用程序的一小部分。但是如果你涉及到服务层这种方式是不凑效的,我们就需要另一种方式了。

<强> 3。整体测试

大多数弹簧引导下的接口测试是整体而又全面的测试,涉及到控制层,服务层,持久层等方方面面,所以需要加载比较完整的弹簧上引导下文。这时我们可以这样做,声明一个抽象的测试基类:

包cn.felord.custom;
  
  进口org.springframework.beans.factory.annotation.Autowired;
  进口org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
  进口org.springframework.boot.test.context.SpringBootTest;
  进口org.springframework.test.web.servlet.MockMvc;/* *
  *测试基类,
  * @author felord.cn
  */@SpringBootTest
  @AutoConfigureMockMvc
  抽象类CustomSpringInjectApplicationTests {/* *
  *模拟mvc。
  */@ autowired
  MockMvc MockMvc;//其它公共依赖和处理方法
  }

只有当@AutoConfigureMockMvc存在时MockMvc才会被注入Spring IoC。

然后针对具体的控制层进行如下测试代码的编写:

包cn.felord.custom;
  
  进口lombok.SneakyThrows;
  进口org.hamcrest.core.Is;
  进口org.junit.jupiter.api.Test;
  进口org.springframework.http.MediaType;
  进口org.springframework.test.web.servlet.ResultMatcher;
  进口org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
  进口org.springframework.test.web.servlet.result.MockMvcResultHandlers;
  
  进口静态org.springframework.test.web.servlet.result.MockMvcResultMatchers。*;/* *
  *测试FooController。
  *
  * @author felord.cn
  */公开课FooTests延伸CustomSpringInjectApplicationTests {/* *
  */foo/地图接口测试。
  */@SneakyThrows
  @Test
  空白contextLoads () {
  mockMvc.perform (MockMvcRequestBuilders.get (“/foo/map"))
  .isOk .andExpect (ResultMatcher.matchAll(状态()(),
  内容().contentType (MediaType.APPLICATION_JSON),
  jsonPath (“.test"美元;,我(“bar"))))
  .andDo (MockMvcResultHandlers.print ());
  }
  }

<>强4。MockMvc测试

集成测试时,希望能够通过输入URL对控制器进行测试,如果通过启动服务器,建立http客户端进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,为了可以对控制器进行测试就引入了MockMvc。

MockMvc实现了对http请求的模拟,能够直接使用网络的形式,转换到控制器的调用,这样可以使得测试速度快,不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。接下来我们来一步步构造一个测试的模拟请求,假设我们存在一个下面这样的接口:

Spring MVC接口如何使用模拟进行测试