集成测试自动配置
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 {
}