SpringBoot Test引入編程式的Properties配置

? ? ? ? ? 在使用@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)正常,無法確保測(cè)試應(yīng)用加載正常,這是為何?

? ? ? ? ?這是因?yàn)镾pringbootTest啟動(dòng)的時(shí)候是使用了默認(rèn)的SpringApplication的無參構(gòu)造函數(shù),并沒有使用我們傳入的class,那么在測(cè)試場(chǎng)景下該如何設(shè)置應(yīng)用的屬性呢?辦法就是自定義ApplicationContextInitializer.先看解決方案如下:

我們需要先定義一個(gè)TestApplicationContextInitializer,在initialize方法中將對(duì)應(yīng)的properties配置設(shè)置到PropertySources中。然后在Test類上增加SpringBootTest包下的注解ContextConfiguration,initializers指明為我們新建的類。這樣在測(cè)試類啟動(dòng)的時(shí)候就會(huì)執(zhí)行initialize方法將我們獲取的Properties屬性設(shè)置到PropertySource中,這樣程序就可以讀取到配置了。

為什么要這樣做呢?因?yàn)镾pringbootTest在啟動(dòng)的時(shí)候會(huì)新建一個(gè)buildTestContext上下文,它使用的是GenericWebApplicationContext.它是通過SpringBootContextLoader這個(gè)類來加載的。如下圖所示:

SpringBootContextLoader會(huì)讀取所有的ApplicationContextInitializer,然后在SpringApplication在執(zhí)行run方法的時(shí)候就會(huì)執(zhí)行所有的initlization方法。如下入所示的applyInitializers方法。這時(shí)候就會(huì)執(zhí)行我們剛才加的測(cè)試類的方法。這樣我們就把Properties設(shè)置到應(yīng)用中了。


@程序員,@IT互聯(lián)網(wǎng) ?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容