今天就跟大家聊聊有关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请求的模拟,能够直接使用网络的形式,转换到控制器的调用,这样可以使得测试速度快,不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。接下来我们来一步步构造一个测试的模拟请求,假设我们存在一个下面这样的接口: