? ? ? ? ? 在使用@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这个类来加载的。如下图所示: