SpringBoot Test引入编程式的Properties配置

          在使用@SpringBootTest进行单元测试的时候我们可以指定class属性为应用的启动main函数,应用的启动main函数中假如我们设置了Properties为编程方式获取的,不用resources目录下的application.properties.那么只能确保应用启动正常,无法确保测试应用加载正常,这是为何?

         这是因为SpringbootTest启动的时候是使用了默认的SpringApplication的无参构造函数,并没有使用我们传入的class,那么在测试场景下该如何设置应用的属性呢?办法就是自定义ApplicationContextInitializer.先看解决方案如下:

我们需要先定义一个TestApplicationContextInitializer,在initialize方法中将对应的properties配置设置到PropertySources中。然后在Test类上增加SpringBootTest包下的注解ContextConfiguration,initializers指明为我们新建的类。这样在测试类启动的时候就会执行initialize方法将我们获取的Properties属性设置到PropertySource中,这样程序就可以读取到配置了。

为什么要这样做呢?因为SpringbootTest在启动的时候会新建一个buildTestContext上下文,它使用的是GenericWebApplicationContext.它是通过SpringBootContextLoader这个类来加载的。如下图所示:

SpringBootContextLoader会读取所有的ApplicationContextInitializer,然后在SpringApplication在执行run方法的时候就会执行所有的initlization方法。如下入所示的applyInitializers方法。这时候就会执行我们刚才加的测试类的方法。这样我们就把Properties设置到应用中了。


@程序员,@IT互联网  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容