Misko Hevery 的 Google talk 深入解释了依赖注入的 “为什么”,所以,让我们看看它在实践中是如何使用的。在关注点分离(常见错误 #3)一节中,我们创建了一个服务和控制器类。假设我们想在 TopTalentService 行为正确的前提下测试控制器。我们可以通过提供一个单独的配置类来插入一个模拟对象来代替实际的服务实现:
- @Configuration
- public class SampleUnitTestConfig {
- @Bean
- public TopTalentService topTalentService() {
- TopTalentService topTalentService = Mockito.mock(TopTalentService.class);
- Mockito.when(topTalentService.getTopTalent()).thenReturn(
- Stream.of("Mary", "Joel").map(TopTalentData::new).collect(Collectors.toList()));
- return topTalentService;
- }
- }复制代码
然后,我们可以通过告诉 Spring 使用 SampleUnitTestConfig 作为它的配置类来注入模拟对象:
- @ContextConfiguration(classes = { SampleUnitTestConfig.class })复制代码
之后,我们就可以使用上下文配置将 Bean 注入到单元测试中。
10. 常见错误十:缺乏测试,或测试不当
尽管单元测试的概念已经存在很长时间了,但很多开发人员似乎要么 “忘记” 做这件事(特别是如果它不是 “必需” 的时候),要么只是在事后把它添加进来。这显然是不可取的,因为测试不仅应该验证代码的正确性,还应该作为程序在不同场景下应如何表现的文档。
在测试 Web 服务时,很少只进行 “纯” 单元测试,因为通过 HTTP 进行通信通常需要调用 Spring 的 DispatcherServlet,并查看当收到一个实际的 HttpServletRequest 时会发生什么(使它成为一个 “集成” 测试,处理验证、序列化等)。REST Assured,一个用于简化测试REST服务的 Java DSL,在 MockMVC 之上,已经被证明提供了一个非常优雅的解决方案。考虑以下带有依赖项注入的代码片段:
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(classes = {
- Application.class,
- SampleUnitTestConfig.class
- })
- public class RestAssuredTestDemonstration {
- @Autowired
- private TopTalentController topTalentController;
- @Test
- public void shouldGetMaryAndJoel() throws Exception {
- // given
- MockMvcRequestSpecification givenRestAssuredSpecification = RestAssuredMockMvc.given()
- .standaloneSetup(topTalentController);
- // when
- MockMvcResponse response = givenRestAssuredSpecification.when().get("/toptal/get");
- // then
- response.then().statusCode(200);
- response.then().body("name", hasItems("Mary", "Joel"));
- }
- }复制代码
SampleUnitTestConfig 类将 TopTalentService 的模拟实现连接到 TopTalentController 中,而所有的其他类都是通过扫描应用类所在包的下级包目录来推断出的标准配置。RestAssuredMockMvc 只是用来设置一个轻量级环境,并向 /toptal/get 端点发送一个 GET 请求。
11. 成为 Spring 大师
Spring 是一个功能强大的框架,很容易上手,但需要一些投入和时间才可以完全掌握。长远来看,花时间熟悉框架肯定会提高你的生产力,并最终助你写出更干净的代码,成为更好的开发人员。
想寻找更多资源,Spring In Action 是一本涵盖了很多 Spring 核心主题的优秀实战书籍。 【编辑推荐】 - 浅谈Java Web经典三层架构和MVC框架模式
- 微软宣布 SQL Server 2019 免费支持 Java
- Python与C语言、Java、Nodejs、Golang进行性能测试比较
- 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?
- 5种用于前端开发的JavaScript替代方案
【责任编辑:华轩 TEL:(010)68476606】
点赞 0 (编辑:PHP编程网 - 黄冈站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|