slice_Spring Boot Web Slice测试–示例
slice
Spring Boot 引入了一段时间的测试切片 ,花了我一些时间来研究它并探索它的一些细微差别。
背景
使用此功能的主要原因是减少样板。 考虑一个看起来像这样的控制器,仅适用于使用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
slice
slice_Spring Boot Web Slice测试–示例相关推荐
- Spring Boot Web Slice测试–示例
春天开机推出 测试切片而回,它已经采取了一些时间来解决它我的头,并探讨一些细微的差别. 背景 使用此功能的主要原因是减少样板. 考虑一个看起来像这样的控制器,仅适用于使用Kotlin编写的各种控制器. ...
- spring boot web 开发示例
一.创建Maven工程 创建maven工程,packaging 类型选择jar. 二.配置相关maven依赖. 1,首先你需要在pom中最上方添加spring boot的父级依赖,这样当前的项目就是S ...
- 180多个Web应用程序测试示例测试用例
180多个Web应用程序测试示例测试用例 假设:假设您的应用程序支持以下功能 各种领域的表格 儿童窗户 应用程序与数据库进行交互 各种搜索过滤条件和显示结果 图片上传 发送电子邮件功能 数据导出功能 ...
- 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 ...
- eclipse 创建maven 项目 动态web工程完整示例
需求表均同springmvc案例 此处只是使用maven 注意,以下所有需要建立在你的eclipse等已经集成配置好了maven了,说白了就是新建项目的时候已经可以找到maven了 没有的话需要安装m ...
- Kali Linux Web 渗透测试— 第十二课-websploit
Kali Linux Web 渗透测试- 第十二课-websploit 文/玄魂 目录 Kali Linux Web 渗透测试- 第十二课-websploit..................... ...
- spring boot web jar说明
spring boot web jar说明 spring-boot-starter-web: spring-boot-starter:spring核心jar,自动配置支持.日志和YAML spring ...
- web安全测试视频课程专题_有关有效企业测试的视频课程
web安全测试视频课程专题 我已经制作了一些有关有效企业测试的视频. 在实际项目中,我仍然认为该主题非常重要. 这是我在测试Enterprise Java项目中的经验以及一些示例. 1.介绍和有效的M ...
最新文章
- 《科学》杂志展望2020年十大科学头条
- 阿里、腾讯基本薪资曝光,资深算法工程师24万美元,高级研究员26万美元
- 用u盘做引导,往硬盘中安装ubuntu
- 2018.11.01 NOIP训练 cost数(搜索+容斥原理)
- 新海诚没有参与制作的作品_继《你的名字》之后,新海诚又出新作啦!!
- centos 安装mysql时错误unknown variable #39;defaults-file=/opt/redmine-2.6.0-2/mysql/my.cnf#39;...
- YAML_02 playbook的ping脚本检测
- 一位在项目上的好友求助
- 周末送新书 | 一文了解预训练语言模型!
- 大一上期c语言实验报告2,大一上期C语言实验报告1熟悉实验环境
- jackson的简单实用实例(json)
- Spring AOP 本质(1)
- 开源实战 | 手把手教你在 Azure 上畅享 SAP、SUSE全套解决方案
- 4个免费代码自动生成神器
- 美食杰(个人主页编辑资料)
- C#dgv调用数据中存储的路径来显示图片
- 雅斯贝尔斯:技术世界加剧了自我迷失
- cortana小娜不能文字搜索,只能用语音搜索【修复教程】
- 2022年最赚钱地推项目-WiFi贴项目(月入10个W)
- 计算机安全模式还原系统,Win10电脑安全模式怎么还原系统?Win10电脑安全模式还原系统方法步骤...
热门文章
- [NOIP-S 2020]游记(附考前注意事项)
- 【周末狂欢赛6】[AT1219]历史研究(回滚莫队),大魔法师(矩阵+线段树),单峰排列
- [2020.11.25NOIP模拟赛]下棋【dp】
- P3952-时间复杂度【模拟】
- P2514-[HAOI2010]工厂选址【贪心】
- 4、mybatis通过配置类Configuration 实现初始化
- 4、java中的流程控制(程序结构)
- Java中“/”,“.”所代表的文件路径
- 漫画:什么是分布式事务
- 走的走的居然飞起来了……