? ? ? ? ? 在使用@SpringBootTest進(jìn)行單元測(cè)試的時(shí)候我們可以指定class屬性為應(yīng)用的啟動(dòng)main函數(shù)袋倔,應(yīng)用的啟動(dòng)main函數(shù)中假如我們?cè)O(shè)置了Properties為編程方式獲取的渐裸,不用resources目錄下的application.properties.那么只能確保應(yīng)用啟動(dòng)正常萍肆,無(wú)法確保測(cè)試應(yīng)用加載正常,這是為何?
? ? ? ? ?這是因?yàn)镾pringbootTest啟動(dòng)的時(shí)候是使用了默認(rèn)的SpringApplication的無(wú)參構(gòu)造函數(shù),并沒(méi)有使用我們傳入的class赢织,那么在測(cè)試場(chǎng)景下該如何設(shè)置應(yīng)用的屬性呢?辦法就是自定義ApplicationContextInitializer.先看解決方案如下:
我們需要先定義一個(gè)TestApplicationContextInitializer馍盟,在initialize方法中將對(duì)應(yīng)的properties配置設(shè)置到PropertySources中于置。然后在Test類(lèi)上增加SpringBootTest包下的注解ContextConfiguration,initializers指明為我們新建的類(lèi)朽合。這樣在測(cè)試類(lèi)啟動(dòng)的時(shí)候就會(huì)執(zhí)行initialize方法將我們獲取的Properties屬性設(shè)置到PropertySource中俱两,這樣程序就可以讀取到配置了饱狂。
為什么要這樣做呢?因?yàn)镾pringbootTest在啟動(dòng)的時(shí)候會(huì)新建一個(gè)buildTestContext上下文宪彩,它使用的是GenericWebApplicationContext.它是通過(guò)SpringBootContextLoader這個(gè)類(lèi)來(lái)加載的休讳。如下圖所示: