集成测试自动配置
Spring Framework 的核心工作是将所有组件编织在一起,构成一个应用程序。
用 SpringJUnit4ClassRunner 进行集成测试
自 Spring 2.5 开始,集成测试支持的形式就变成了 SpringJUnit4ClassRunner
。
这是一个 JUnit 类运行器,会为JUnit测试加载Spring应用程序上下文,并为测试类自动织入所需的 Bean。
@ContextConfiguration
@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());
}
}
@RunWith
的参数是SpringJUnit4ClassRunner.class
,开启了Spring集成测试支持。@ContextConfiguration
指定了如何加载应用程序上下文。SpringJUnit4ClassRunner
还能通过自动织入从应用程序上下文里向测试本身注入Bean。
@ContextConfiguration
没能加载完整的Spring Boot。
Spring Boot应用程序最终是由 SpringApplication
加载的。
SpringApplication
不仅加载应用程序上下文,还会开启日志、加载外部属性(application.properties或application.yml),以及其他Spring Boot特性。用 @ContextConfiguration
则得不到这些特性。
@SpringBootTest
可以把 @ContextConfiguration
替换为Spring Boot 的@SpringBootTest
。
@SpringBootTest
加载Spring应用程序上下文的方式同 SpringApplication
相同,处理方式和生产应用程序中的情况相同。这包括加载外部属性和 Spring Boot 日志。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=AddressBookConfiguration.class)
public class AddressServiceTests {
}