46.4 测试你的自动配置
自动配置会受很多因素影响:用户配置(@Bean定义与Environment自定义)、状况评估(存在特定库)等。具体地,每个测试应当创建一个定义良好的ApplicationContext。它代表了那些自定义的结合。ApplicationContextRunner提供了达成这种目标的好办法。
ApplicationContextRunner经常会定义成测试类的实例变量,用来收集基础的、普遍的配置。下面的例子确保了UserServiceAutoConfiguration总是会被调用:
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(UserServiceAutoConfiguration.class));
如果不得不定义多个自动配置,不需要对它们的声明排序,因为会和应用运行时完全相同的顺序调用它们。
每个测试可以使用runner代表一个特殊的使用案例。例如,下面的样本调用了一个用户配置(UserConfiguration),并且检查自动配置是否没有采用。调用run方法提供了一个回调上下文。它可以与Assert4J一起使用。
@Test
public void defaultServiceBacksOff() {
this.contextRunner.withUserConfiguration(UserConfiguration.class)
.run((context) -> {
assertThat(context).hasSingleBean(UserService.class);
assertThat(context.getBean(UserService.class)).isSameAs(
context.getBean(UserConfiguration.class).myUserService());
});
}
@Configuration
static class UserConfiguration {
@Bean
public UserService myUserService() {
return new UserService("mine");
}
}
也可以很容易地自定义Environment。如下所示:
@Test
public void serviceNameCanBeConfigured() {
this.contextRunner.withPropertyValues("user.name=test123").run((context) -> {
assertThat(context).hasSingleBean(UserService.class);
assertThat(context.getBean(UserService.class).getName()).isEqualTo("test123");
});
}
复制链接