Spring Boot Web Slice测试–示例
春天开机推出 测试切片而回,它已经采取了一些时间来解决它我的头,并探讨一些细微的差别。
背景
使用此功能的主要原因是减少样板。 考虑一个看起来像这样的控制器,仅适用于使用Kotlin编写的各种控制器。
@RestController
@RequestMapping("/users")
class UserController(private val userRepository: UserRepository,private val userResourceAssembler: UserResourceAssembler) {@GetMappingfun getUsers(pageable: Pageable, pagedResourcesAssembler: PagedResourcesAssembler<User>): PagedResources<Resource<User>> {val users = userRepository.findAll(pageable)return pagedResourcesAssembler.toResource(users, this.userResourceAssembler)}@GetMapping("/{id}")fun getUser(id: Long): Resource<User> {return Resource(userRepository.findOne(id))}
}
用于测试此控制器的传统Spring Mock MVC测试将遵循以下原则:
@RunWith(SpringRunner::class)
@WebAppConfiguration
@ContextConfiguration
class UserControllerTests {lateinit var mockMvc: MockMvc@Autowiredprivate val wac: WebApplicationContext? = null@Beforefun setup() {this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build()}@Testfun testGetUsers() {this.mockMvc.perform(get("/users").accept(MediaType.APPLICATION_JSON)).andDo(print()).andExpect(status().isOk)}@EnableSpringDataWebSupport@EnableWebMvc@Configurationclass SpringConfig {@Beanfun userController(): UserController {return UserController(userRepository(), UserResourceAssembler())}@Beanfun userRepository(): UserRepository {val userRepository = Mockito.mock(UserRepository::class.java)given(userRepository.findAll(Matchers.any(Pageable::class.java))).willAnswer({ invocation ->val pageable = invocation.arguments[0] as PageablePageImpl(listOf(User(id = 1, fullName = "one", password = "one", email = "one@one.com"),User(id = 2, fullName = "two", password = "two", email = "two@two.com")), pageable, 10)})return userRepository}}
}
设置这样的测试涉及很多仪式-理解Web环境的Web应用程序上下文被引入,需要创建设置Spring MVC环境的配置,以及满足测试框架需求的MockMvc在每次测试之前进行设置。
网页切片测试
与以前的测试相比,Web Slice测试要简单得多,它专注于测试控制器并隐藏了许多样板代码:
@RunWith(SpringRunner::class)
@WebMvcTest(UserController::class)
class UserControllerSliceTests {@Autowiredlateinit var mockMvc: MockMvc@MockBeanlateinit var userRepository: UserRepository@SpyBeanlateinit var userResourceAssembler: UserResourceAssembler@Testfun testGetUsers() {this.mockMvc.perform(get("/users").param("page", "0").param("size", "1").accept(MediaType.APPLICATION_JSON)).andDo(print()).andExpect(status().isOk)}@Beforefun setUp(): Unit {given(userRepository.findAll(Matchers.any(Pageable::class.java))).willAnswer({ invocation ->val pageable = invocation.arguments[0] as PageablePageImpl(listOf(User(id = 1, fullName = "one", password = "one", email = "one@one.com"),User(id = 2, fullName = "two", password = "two", email = "two@two.com")), pageable, 10)})}
}
它的工作方式是创建一个Spring Application上下文,但过滤掉与Web层无关的所有内容,并仅加载已传递到@WebTest批注中的控制器。 控制器需要的任何依赖关系都可以作为模拟注入。
涉及到一些细微差别,例如,如果我想自己注入某个字段,则可以使用自定义的Spring Configuration进行测试,对于测试,可以使用内部带有@TestConfiguration注释的静态类来完成。以下方式:
@RunWith(SpringRunner::class)
@WebMvcTest(UserController::class)
class UserControllerSliceTests {@Autowiredlateinit var mockMvc: MockMvc@Autowiredlateinit var userRepository: UserRepository@Autowiredlateinit var userResourceAssembler: UserResourceAssembler@Testfun testGetUsers() {this.mockMvc.perform(get("/users").param("page", "0").param("size", "1").accept(MediaType.APPLICATION_JSON)).andDo(print()).andExpect(status().isOk)}@Beforefun setUp(): Unit {given(userRepository.findAll(Matchers.any(Pageable::class.java))).willAnswer({ invocation ->val pageable = invocation.arguments[0] as PageablePageImpl(listOf(User(id = 1, fullName = "one", password = "one", email = "one@one.com"),User(id = 2, fullName = "two", password = "two", email = "two@two.com")), pageable, 10)})}@TestConfigurationclass SpringConfig {@Beanfun userResourceAssembler(): UserResourceAssembler {return UserResourceAssembler()}@Beanfun userRepository(): UserRepository {return mock(UserRepository::class.java)}}}
来自“ TestConfiguration”的Bean将添加到Slice测试所依赖的配置中,并且不会完全替换它。
另一方面,如果我想重写带注释的主“ @SpringBootApplication”主类的加载,则可以显式传递一个Spring Configuration类,但要注意的是,我现在必须负责所有相关的加载工作。 Spring Boot具有我自己的功能(启用自动配置,适当的扫描等),因此可以通过以下方式围绕它来显式批注Spring Boot应用程序的配置:
@RunWith(SpringRunner::class)
@WebMvcTest(UserController::class)
class UserControllerExplicitConfigTests {@Autowiredlateinit var mockMvc: MockMvc@Autowiredlateinit var userRepository: UserRepository@Testfun testGetUsers() {this.mockMvc.perform(get("/users").param("page", "0").param("size", "1").accept(MediaType.APPLICATION_JSON)).andDo(print()).andExpect(status().isOk)}@Beforefun setUp(): Unit {given(userRepository.findAll(Matchers.any(Pageable::class.java))).willAnswer({ invocation ->val pageable = invocation.arguments[0] as PageablePageImpl(listOf(User(id = 1, fullName = "one", password = "one", email = "one@one.com"),User(id = 2, fullName = "two", password = "two", email = "two@two.com")), pageable, 10)})}@SpringBootApplication(scanBasePackageClasses = arrayOf(UserController::class))@EnableSpringDataWebSupportclass SpringConfig {@Beanfun userResourceAssembler(): UserResourceAssembler {return UserResourceAssembler()}@Beanfun userRepository(): UserRepository {return mock(UserRepository::class.java)}}}
但是要注意的是,现在其他测试可能最终会找到这种不理想的内部配置!因此,我的学习一直依赖于最低限度的最小切片测试,如果需要,可以使用@TestConfiguration对其进行扩展。
我在github仓库中有一些更详细的代码示例,其中包含一些可用的示例。
翻译自: https://www.javacodegeeks.com/2017/06/spring-boot-web-slice-test-sample.html
Spring Boot Web Slice测试–示例相关推荐
- slice_Spring Boot Web Slice测试–示例
slice Spring Boot 引入了一段时间的测试切片 ,花了我一些时间来研究它并探索它的一些细微差别. 背景 使用此功能的主要原因是减少样板. 考虑一个看起来像这样的控制器,仅适用于使用Kot ...
- spring boot web 开发示例
一.创建Maven工程 创建maven工程,packaging 类型选择jar. 二.配置相关maven依赖. 1,首先你需要在pom中最上方添加spring boot的父级依赖,这样当前的项目就是S ...
- Spring Boot 应用的测试
Spring Boot 应用的测试 <Spring Boot 实战开发>(陈光剑) -- 基于 Gradle + Kotlin的企业级应用开发最佳实践 本书写到这里,Spring Boot ...
- Spring boot web(2):web综合开发
1 web开发 Spring boot web 开发非常简单,其中包括常用的 json输出.filters.property.log等 1.1 json接口开发 在以前的Spring 开发我么提供js ...
- spring boot web jar说明
spring boot web jar说明 spring-boot-starter-web: spring-boot-starter:spring核心jar,自动配置支持.日志和YAML spring ...
- Spring Boot文件上传示例
一.创建一个简单的包含WEB依赖的SpringBoot项目 pom.xml内容: <!-- Spring Boot web启动器 --> <dependency><gro ...
- Spring Boot Web应用程序中注册 Servlet 的方法实例
Spring Boot Web应用程序中注册 Servlet 的方法实例 本文实例工程源代码:https://github.com/KotlinSpringBoot/demo1_add_servlet ...
- Spring Boot Web
一. 概述 下面我们将进入 SpringBoot 基础阶段的学习. 在没有正式的学习 SpringBoot 之前,我们要先来了解下什么是 Spring . 我们可以打开 Spring 的官网 ( ht ...
- PART 5: INTEGRATING SPRING SECURITY WITH SPRING BOOT WEB
转自:http://justinrodenbostel.com/2014/05/30/part-5-integrating-spring-security-with-spring-boot-web/ ...
最新文章
- vs快捷键及常用设置(vs2012版)
- eclipse提交Git时忽略文件
- python中xml模块_python学习第十五天-2(XML模块)
- zabbix 监控TCP状态连接数
- 《南溪的目标检测学习笔记》——backbone的学习笔记
- keep it SMPL: Automatic estimation of 3d human pose and shape from a single image
- 过程FMEA(PFMEA)步骤一:策划与准备
- Java判断是移动端还是PC端请求
- 论WMS系统的未来前景
- ceph存储 PG的状态机和peering过程
- 什么是互联网产品运营
- TLS流量的X509证书解析,从pcap获取证书并解析
- 帝搜软件新功能发布:知乎关键词seo排名优化上线
- 淘宝搜索上传图片获得上传sid
- 计算机小高考成绩,2018江苏小高考成绩出来了!昆山*亮眼的学校是…
- windows PC 连接Windows作为无线显示器
- 为什么大型网站前端使用PHP,后台逻辑却用Java?
- 亚信安全:坚持自主可控 做中国本土化专业化的安全公司
- 计算机基础教学评价ppt,教学PPT课件:教学PPT的设计原理和评价标准
- js Proxy 从入门到废掉的整个过程
热门文章
- JAVA面试常考系列十
- 捡到东西说给钱才给东西?算不算敲诈勒索……
- Java中数组的赋值方式
- Mybatisplus 自动生成字段 强制覆盖 null或者空字符串也覆盖
- IntelliJ IDEA: 无法创建Java Class文件
- 如何彻底删除MySQL数据库(保姆级教学)
- asset文件夹路径 unity_我们来捣鼓一下Unity的平台跳跃Microgame
- 小微企业名录查询系统_欢迎访问辽宁小微企业名录系统
- redis创建集群报错can‘t connect to node 192.168.163.203
- React 相关的优秀资源