前言
ApplicationContextRunner
是我在 Spring Boot
的 Test Suite
中学习的一个类,我觉得十分好用,有点类似 Spring
@ContextConfiguration
注解的效果但更强大一点,分享下
Demo
public class TestDemo {
// 主配置:全局的、自动装配的 等
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(UserConfigurations.of(MainConfiguration.class));
@Test
public void shouldCustomizeInOrder() {
this.contextRunner
// 用户配置:局部的
.withUserConfiguration(UserConfiguration.class)
.run(context -> {
// 执行 断言 等测试操作
Customizer customizerOne = context.getBean("customizerOne", Customizer.class);
Customizer customizerTwo = context.getBean("customizerTwo", Customizer.class);
InOrder inOrder = Mockito.inOrder(customizerOne, customizerTwo);
then(customizerOne).should(inOrder).customize(any(TargetObject.class));
then(customizerTwo).should(inOrder).customize(any(TargetObject.class));
// then(customizerOne).should(inOrder).customize(any(TargetObject.class));
});
}
static class MainConfiguration {
@Bean
public TargetObject targetObject(ObjectProvider<Customizer> customizers) {
TargetObject targetObject = new TargetObject();
// ObjectProvider#orderedStream 可以返回基于 @Order 排序的 bean 集合
customizers.orderedStream()
.forEach(customizer -> customizer.customize(targetObject));
return targetObject;
}
}
static class UserConfiguration {
@Bean
@Order(2)
public Customizer customizerTwo() {
return mock(Customizer.class);
}
@Bean
@Order(1)
public Customizer customizerOne() {
return mock(Customizer.class);
}
}
}
- 这个
Test Suite
是验证TargetObject
是否按照指定的顺序被Customizer
自定义处理 - 其中
ApplicationContextRunner
可以基于指定的配置启动一个ApplicationContext
,并在测试代码中回调使用来做一些断言
等操作 ApplicationContextRunner#withConfiguration
方法类似与指定全局配置类
,比如指定要测试的自动装配类
等- 在测试代码中
ApplicationContextRunner#withUserConfiguration
方法指定用户配置类,类似于局部配置
,可以模拟覆盖自动装配
的场景 ApplicationContextRunner#run
方法可以对ApplicationContext
进行回调操作,这里就是测试代码的主体,进行一些断言
等操作,示例中是判断目标mock
对象是否按顺序执行- 测试代码执行完成后
ApplicationContextRunner
会自行销毁对应的ApplicationContext
其中,ObjectProvider#orderedStream 返回一个基于 @Order 注解的有序 bean 集合
,是个很好的知识点
总结
借助 ApplicationContextRunner
可以在 Spring Boot
下写出更加强大的 Test Suite