View on GitHub

spring-boot-in-action

Spring Boot 实战笔记

集成测试自动配置

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());
    }
}

@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 {

}