赵走x博客
首页
书籍
软件
工具
古诗词
搜索
登录
11、测试运行中的应用程序
10、测试 Web 应用程序
9、集成测试自动配置
8、定制应用程序错误页面
7、通过属性文件外置配置
6、覆盖 Spring Boot 自动配置
5、使用自动配置
4、使用起步依赖
3、运用 Spring Boot
2、Spring Boot 入门
1、Spring 风云再起
9、集成测试自动配置
资源编号:76579
Java
Spring Boot实战
热度:33
有人说,如果你不知道要去哪,走就是了。但在软件开发领域,如果你没有目标,那结果往 往是开发出一个满是bug的应用程序,没人用得了。 在编写应用程序时,明确目标的最佳方法就是写测试,确定应用程序的行为是否符合预期。 如果测试失败了,你就有活要干了。如果测试通过了,那你就成功了(至少在你觉得还有其他测 试要写之前,是这样的)。 究竟是在编写业务代码之前还是之后写测试,这并不重要。重要的是,写测试不仅仅是为了 验证代码的准确性,还要确认它符合预期。测试也是一道保障,确认应用程序在改进的同时不会 破坏已有的东西。 在编写单元测试的时候,Spring通常不需要介入。Spring鼓励松耦合、接口驱动的设计,这 些都能让你很轻松地编写单元测试。但是在写单元测试时并不需要用到Spring。 但是,集成测试要用到Spring。如果生产应用程序使用Spring来配置并组装组件,那么测试 就需要用它来配置并组装那些组件。 Spring的SpringJUnit4ClassRunner可以在基于JUnit的应用程序测试里加载Spring应用程 序上下文。在测试Spring Boot应用程序时,Spring Boot除了拥有Spring的集成测试支持,还开启 了自动配置和Web服务器,并提供了不少实用的测试辅助工具。 在本章中,我们会看到Spring Boot的各种集成测试支持。让我们先来看看如何在Spring Boot 应用程序上下文里做测试。 Spring Framework的核心工作是将所有组件编织在一起,构成一个应用程序。整个过程就是 读取配置说明(可以是XML、基于Java的配置、基于Groovy的配置或其他类型的配置),程序上下文里初始化Bean,将Bean注入依赖它们的其他Bean中。 对Spring应用程序进行集成测试时,让Spring遵照生产环境来组装测试目标Bean是非常重要 的一点。当然,你也可以手动初始化组件,并将它们注入其他组件,但对那些大型应用程序来说, 这是项费时费力的工作。而且,Spring提供了额外的辅助功能,比如组件扫描、自动织入和声明 性切面(缓存、事务和安全,等等)。你要把这些活都干了,基本也就是把Spring再造了一次,最 好还是让Spring替你把重活都做了吧,哪怕是在集成测试里。 Spring自1.1.1版就向集成测试提供了极佳的支持。自Spring 2.5开始,集成测试支持的形式就 变成了SpringJUnit4ClassRunner。这是一个JUnit类运行器,会为JUnit测试加载Spring应用程 序上下文,并为测试类自动织入所需的Bean。 举例来说,看一下代码清单4-1,这是一个非常基本的Spring集成测试。 代码清单4-1:用SpringJUnit4ClassRunner对Spring应用程序进行集成测试 ``` @RunWith(SpringJUnit4ClassRunner.class) //加载应用程序上下文 @ContextConfiguration(classes = AddressBookConfiguration.class) public class AddressServiceTests { @Autowired //注入地址服务 private AddressService addressService; @Test public void testService() { //测试地址服务 Address address = addressService.findByLastName("Sheman"); assertEquals("P", address.getFirstName()); assertEquals("Sherman", address.getLastName()); assertEquals("42 Wallaby Way", address.getAddressLine1()); assertEquals("Sydney", address.getCity()); assertEquals("New South Wales", address.getState()); assertEquals("2000", address.getPostCode()); } } ``` 如你所见,AddressServiceTests上加注了@RunWith和@ContextConfiguration注解。 @RunWith的参数是SpringJUnit4ClassRunner.class,开启了Spring集成测试支持。 ① 与此 同时,@ContextConfiguration指定了如何加载应用程序上下文。此处我们让它加载AddressBookConfiguration里配置的Spring应用程序上下文。 除了加载应用程序上下文,SpringJUnit4ClassRunner还能通过自动织入从应用程序上下 文里向测试本身注入Bean。因为这是一个针对AddressService Bean的测试,所以需要将它注 入测试。最后,testService()方法调用地址服务并验证了结果。 >① 在Spring 4.2里,你可以选择基于规则的SpringClassRule和SpringMethodRule来代替SpringJUnit4ClassRunner。 虽然@ContextConfiguration在加载Spring应用程序上下文的过程中做了很多事情,但它 没能加载完整的Spring Boot。Spring Boot应用程序最终是由SpringApplication加载的。它可 以显式加载(如代码清单2-1所示),在这里也可以使用SpringBootServletInitializer(我 们会在第8章里看到具体做法)。SpringApplication不仅加载应用程序上下文,还会开启日志、 加载外部属性(application.properties或application.yml),以及其他Spring Boot特性。用@ContextConfiguration则得不到这些特性。 要在集成测试里获得这些特性, 可以把 @ContextConfiguration 替换为Spring Boot的 @SpringApplicationConfiguration: ``` @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration( classes=AddressBookConfiguration.class) public class AddressServiceTests { ... } ``` @SpringApplicationConfiguration的用法和@ContextConfiguration大致相同,但 也有不同的地方,@SpringApplicationConfiguration加载Spring应用程序上下文的方式同 SpringApplication 相同, 处理方式和生产应用程序中的情况相同。 这包括加载外部属性和 Spring Boot日志。 我们有充分的理由说,在大多数情况下,为Spring Boot应用程序编写测试时应该用@SpringApplicationConfiguration 代替 @ContextConfiguration 。 在本章中, 我们当然也会用 @SpringApplicationConfiguration来为Spring Boot应用程序(包括那些面向前端的应用程 序)编写测试。 说到Web测试,这正是我们接下来要做的。