领先一步
VMware 提供培训和认证,以加快您的进度。
了解更多自动配置是 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
的测试,可以使用WebApplicationContextRunner
或ReactiveWebApplicationContextRunner
。
自动配置还可以通过类路径上特定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"));
}