使用 Spring Boot 2.0 测试自动配置

工程 | Madhura Bhave | 2018年3月7日 | ...

自动配置是 Spring Boot 最强大的功能之一。自动配置类的测试通常遵循相同的模式。大多数测试启动一个包含被测自动配置类的ApplicationContext,并根据测试加载额外的配置来模拟用户行为。这种模式的重复会导致代码库中出现大量重复代码。

Spring Boot 2.0 提供了一套新的测试辅助工具,可以轻松配置ApplicationContext来模拟自动配置测试场景。以下示例配置了一个ApplicationContextRunner来测试UserServiceAutoConfiguration

private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
    .withConfiguration(AutoConfigurations.of(UserServiceAutoConfiguration.class));

由于测试类中的大多数测试共享类似的配置,因此最好将ApplicationContextRunner用作测试类的字段,并使用一些通用配置进行设置。

每个测试都可以使用所需的配置和属性进一步自定义ApplicationContext

@Test
public void someTest() {
    this.contextRunner
        .withPropertyValues("user.my.property=test")
	    .withUserConfiguration(MyConfiguration.class)
	    .run(...);
}

除了调用UserServiceAutoConfiguration之外,上面的示例还注册了MyConfiguration并将user.my.property属性设置为test

ApplicationContextRunner透明地复制了 Spring Boot 使用的配置初始化顺序(首先扫描用户配置,然后根据其定义的顺序扫描自动配置)。

支持AssertableApplicationContext,它提供对ApplicationContext的AssertJ风格断言。您还可以像以下示例所示那样链接多个断言。

@Test
public void someTest() {
    this.contextRunner.run((context) -> {
        assertThat(context).hasSingleBean(MyBean.class);
        assertThat(context).getBeanNames(UserRule.class).hasSize(2);
    });
}

也可以对启动失败的ApplicationContext使用断言来检查失败原因。无论如何,上下文生命周期都不需要再由测试管理了,即上下文会自动关闭。

对于需要WebApplicationContext的测试,可以使用WebApplicationContextRunnerReactiveWebApplicationContextRunner

自动配置还可以通过类路径上特定Class的存在来影响,使用@ConditionalOnClass注解。ApplicationContextRunner允许您测试在运行时缺少给定Class时会发生什么。Spring Boot 附带一个FilteredClassLoader,运行器可以轻松使用它。在下面的示例中,我们断言如果UserService不存在,则自动配置将被正确禁用。

@Test
public void serviceIsIgnoredIfLibraryIsNotPresent() {
    this.contextRunner
        .withClassLoader(new FilteredClassLoader(UserService.class))
        .run((context) -> assertThat(context)
                .doesNotHaveBean("userService"));
}

获取 Spring 时事通讯

通过 Spring 时事通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加快您的进度。

了解更多

获得支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部