春天开机推出 测试切片而回,它已经采取了一些时间来解决它我的头,并探讨一些细微的差别。

背景

使用此功能的主要原因是减少样板。 考虑一个看起来像这样的控制器,仅适用于使用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测试–示例相关推荐

  1. slice_Spring Boot Web Slice测试–示例

    slice Spring Boot 引入了一段时间的测试切片 ,花了我一些时间来研究它并探索它的一些细微差别. 背景 使用此功能的主要原因是减少样板. 考虑一个看起来像这样的控制器,仅适用于使用Kot ...

  2. spring boot web 开发示例

    一.创建Maven工程 创建maven工程,packaging 类型选择jar. 二.配置相关maven依赖. 1,首先你需要在pom中最上方添加spring boot的父级依赖,这样当前的项目就是S ...

  3. Spring Boot 应用的测试

    Spring Boot 应用的测试 <Spring Boot 实战开发>(陈光剑) -- 基于 Gradle + Kotlin的企业级应用开发最佳实践 本书写到这里,Spring Boot ...

  4. Spring boot web(2):web综合开发

    1 web开发 Spring boot web 开发非常简单,其中包括常用的 json输出.filters.property.log等 1.1 json接口开发 在以前的Spring 开发我么提供js ...

  5. spring boot web jar说明

    spring boot web jar说明 spring-boot-starter-web: spring-boot-starter:spring核心jar,自动配置支持.日志和YAML spring ...

  6. Spring Boot文件上传示例

    一.创建一个简单的包含WEB依赖的SpringBoot项目 pom.xml内容: <!-- Spring Boot web启动器 --> <dependency><gro ...

  7. Spring Boot Web应用程序中注册 Servlet 的方法实例

    Spring Boot Web应用程序中注册 Servlet 的方法实例 本文实例工程源代码:https://github.com/KotlinSpringBoot/demo1_add_servlet ...

  8. Spring Boot Web

    一. 概述 下面我们将进入 SpringBoot 基础阶段的学习. 在没有正式的学习 SpringBoot 之前,我们要先来了解下什么是 Spring . 我们可以打开 Spring 的官网 ( ht ...

  9. PART 5: INTEGRATING SPRING SECURITY WITH SPRING BOOT WEB

    转自:http://justinrodenbostel.com/2014/05/30/part-5-integrating-spring-security-with-spring-boot-web/ ...

最新文章

  1. vs快捷键及常用设置(vs2012版)
  2. eclipse提交Git时忽略文件
  3. python中xml模块_python学习第十五天-2(XML模块)
  4. zabbix 监控TCP状态连接数
  5. 《南溪的目标检测学习笔记》——backbone的学习笔记
  6. keep it SMPL: Automatic estimation of 3d human pose and shape from a single image
  7. 过程FMEA(PFMEA)步骤一:策划与准备
  8. Java判断是移动端还是PC端请求
  9. 论WMS系统的未来前景
  10. ceph存储 PG的状态机和peering过程
  11. 什么是互联网产品运营
  12. TLS流量的X509证书解析,从pcap获取证书并解析
  13. 帝搜软件新功能发布:知乎关键词seo排名优化上线
  14. 淘宝搜索上传图片获得上传sid
  15. 计算机小高考成绩,2018江苏小高考成绩出来了!昆山*亮眼的学校是…
  16. windows PC 连接Windows作为无线显示器
  17. 为什么大型网站前端使用PHP,后台逻辑却用Java?
  18. 亚信安全:坚持自主可控 做中国本土化专业化的安全公司
  19. 计算机基础教学评价ppt,教学PPT课件:教学PPT的设计原理和评价标准
  20. js Proxy 从入门到废掉的整个过程

热门文章

  1. JAVA面试常考系列十
  2. 捡到东西说给钱才给东西?算不算敲诈勒索……
  3. Java中数组的赋值方式
  4. Mybatisplus 自动生成字段 强制覆盖 null或者空字符串也覆盖
  5. IntelliJ IDEA: 无法创建Java Class文件
  6. 如何彻底删除MySQL数据库(保姆级教学)
  7. asset文件夹路径 unity_我们来捣鼓一下Unity的平台跳跃Microgame
  8. 小微企业名录查询系统_欢迎访问辽宁小微企业名录系统
  9. redis创建集群报错can‘t connect to node 192.168.163.203
  10. React 相关的优秀资源