班级网站自助建设功能,没有充值入口的传奇,经营类网页游戏大全,免费行情网站app下载大全sliceSpring Boot 引入了一段时间的测试切片 #xff0c;花了我一些时间来研究它并探索它的一些细微差别。 背景 使用此功能的主要原因是减少样板。 考虑一个看起来像这样的控制器#xff0c;仅适用于使用Kotlin编写的各种控制器。 RestController
RequestMapping(/u… slice Spring Boot 引入了一段时间的测试切片 花了我一些时间来研究它并探索它的一些细微差别。 背景 使用此功能的主要原因是减少样板。 考虑一个看起来像这样的控制器仅适用于使用Kotlin编写的各种控制器。 RestController
RequestMapping(/users)
class UserController(private val userRepository: UserRepository,private val userResourceAssembler: UserResourceAssembler) {GetMappingfun getUsers(pageable: Pageable, pagedResourcesAssembler: PagedResourcesAssemblerUser): PagedResourcesResourceUser {val users userRepository.findAll(pageable)return pagedResourcesAssembler.toResource(users, this.userResourceAssembler)}GetMapping(/{id})fun getUser(id: Long): ResourceUser {return Resource(userRepository.findOne(id))}
} 用于测试此控制器的传统Spring Mock MVC测试将遵循以下原则 RunWith(SpringRunner::class)
WebAppConfiguration
ContextConfiguration
class UserControllerTests {lateinit var mockMvc: MockMvcAutowiredprivate val wac: WebApplicationContext? nullBeforefun setup() {this.mockMvc MockMvcBuilders.webAppContextSetup(this.wac).build()}Testfun testGetUsers() {this.mockMvc.perform(get(/users).accept(MediaType.APPLICATION_JSON)).andDo(print()).andExpect(status().isOk)}EnableSpringDataWebSupportEnableWebMvcConfigurationclass 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 oneone.com),User(id 2, fullName two, password two, email twotwo.com)), pageable, 10)})return userRepository}}
} 设置这样的测试涉及很多仪式-理解Web环境的Web应用程序上下文被引入需要创建设置Spring MVC环境的配置以及满足测试框架需求的MockMvc在每次测试之前进行设置。 网页切片测试 与以前的测试相比Web Slice测试要简单得多它专注于测试控制器并隐藏了许多样板代码 RunWith(SpringRunner::class)
WebMvcTest(UserController::class)
class UserControllerSliceTests {Autowiredlateinit var mockMvc: MockMvcMockBeanlateinit var userRepository: UserRepositorySpyBeanlateinit var userResourceAssembler: UserResourceAssemblerTestfun 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 oneone.com),User(id 2, fullName two, password two, email twotwo.com)), pageable, 10)})}
} 它通过创建Spring Application上下文但过滤掉与Web层无关的所有内容并仅加载已传递到WebTest批注中的控制器来工作。 控制器需要的任何依赖关系都可以作为模拟注入。 涉及到一些细微差别例如如果我想自己注入某个字段则可以使用自定义的Spring Configuration进行测试对于测试可以使用内部TestConfiguration注释的静态类来完成。以下方式 RunWith(SpringRunner::class)
WebMvcTest(UserController::class)
class UserControllerSliceTests {Autowiredlateinit var mockMvc: MockMvcAutowiredlateinit var userRepository: UserRepositoryAutowiredlateinit var userResourceAssembler: UserResourceAssemblerTestfun 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 oneone.com),User(id 2, fullName two, password two, email twotwo.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: MockMvcAutowiredlateinit var userRepository: UserRepositoryTestfun 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 oneone.com),User(id 2, fullName two, password two, email twotwo.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.htmlslice