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测试–示例相关推荐

  1. Spring Boot Web Slice测试–示例

    春天开机推出 测试切片而回,它已经采取了一些时间来解决它我的头,并探讨一些细微的差别. 背景 使用此功能的主要原因是减少样板. 考虑一个看起来像这样的控制器,仅适用于使用Kotlin编写的各种控制器. ...

  2. spring boot web 开发示例

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

  3. 180多个Web应用程序测试示例测试用例

    180多个Web应用程序测试示例测试用例 假设:假设您的应用程序支持以下功能 各种领域的表格 儿童窗户 应用程序与数据库进行交互 各种搜索过滤条件和显示结果 图片上传 发送电子邮件功能 数据导出功能 ...

  4. Spring Boot 应用的测试

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

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

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

  6. eclipse 创建maven 项目 动态web工程完整示例

    需求表均同springmvc案例 此处只是使用maven 注意,以下所有需要建立在你的eclipse等已经集成配置好了maven了,说白了就是新建项目的时候已经可以找到maven了 没有的话需要安装m ...

  7. Kali Linux Web 渗透测试— 第十二课-websploit

    Kali Linux Web 渗透测试- 第十二课-websploit 文/玄魂 目录 Kali Linux Web 渗透测试- 第十二课-websploit..................... ...

  8. spring boot web jar说明

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

  9. web安全测试视频课程专题_有关有效企业测试的视频课程

    web安全测试视频课程专题 我已经制作了一些有关有效企业测试的视频. 在实际项目中,我仍然认为该主题非常重要. 这是我在测试Enterprise Java项目中的经验以及一些示例. 1.介绍和有效的M ...

最新文章

  1. 《科学》杂志展望2020年十大科学头条
  2. 阿里、腾讯基本薪资曝光,资深算法工程师24万美元,高级研究员26万美元
  3. 用u盘做引导,往硬盘中安装ubuntu
  4. 2018.11.01 NOIP训练 cost数(搜索+容斥原理)
  5. 新海诚没有参与制作的作品_继《你的名字》之后,新海诚又出新作啦!!
  6. centos 安装mysql时错误unknown variable #39;defaults-file=/opt/redmine-2.6.0-2/mysql/my.cnf#39;...
  7. YAML_02 playbook的ping脚本检测
  8. 一位在项目上的好友求助
  9. 周末送新书 | 一文了解预训练语言模型!
  10. 大一上期c语言实验报告2,大一上期C语言实验报告1熟悉实验环境
  11. jackson的简单实用实例(json)
  12. Spring AOP 本质(1)
  13. 开源实战 | 手把手教你在 Azure 上畅享 SAP、SUSE全套解决方案
  14. 4个免费代码自动生成神器
  15. 美食杰(个人主页编辑资料)
  16. C#dgv调用数据中存储的路径来显示图片
  17. 雅斯贝尔斯:技术世界加剧了自我迷失
  18. cortana小娜不能文字搜索,只能用语音搜索【修复教程】
  19. 2022年最赚钱地推项目-WiFi贴项目(月入10个W)
  20. 计算机安全模式还原系统,Win10电脑安全模式怎么还原系统?Win10电脑安全模式还原系统方法步骤...

热门文章

  1. [NOIP-S 2020]游记(附考前注意事项)
  2. 【周末狂欢赛6】[AT1219]历史研究(回滚莫队),大魔法师(矩阵+线段树),单峰排列
  3. [2020.11.25NOIP模拟赛]下棋【dp】
  4. P3952-时间复杂度【模拟】
  5. P2514-[HAOI2010]工厂选址【贪心】
  6. 4、mybatis通过配置类Configuration 实现初始化
  7. 4、java中的流程控制(程序结构)
  8. Java中“/”,“.”所代表的文件路径
  9. 漫画:什么是分布式事务
  10. 走的走的居然飞起来了……