1.背景
項(xiàng)目中在寫測(cè)試用例的時(shí)候遇到了一個(gè)問題擎颖,我用spring初始化的h2數(shù)據(jù)庫,當(dāng)前一個(gè)測(cè)試用例運(yùn)行過后观游,數(shù)據(jù)被修改搂捧,就變成了臟數(shù)據(jù),如果后一個(gè)測(cè)試用例再使用這條數(shù)據(jù)就可能無法通過測(cè)試懂缕。同樣异旧,如果前一個(gè)用例修改了spring的bean屬性,后面一個(gè)測(cè)試用例同樣會(huì)有問題√嵊叮基于這樣的情況,我可能希望每次運(yùn)行測(cè)試用例spring的上下文都能被重新初始化一下荤崇,這樣可以保證一個(gè)清潔的spring上下文環(huán)境拌屏。
2.@DirtiesContext
于是我現(xiàn)了spring提供了@DirtiesContext這樣一個(gè)注解。@DirtiesContext是一個(gè)spring測(cè)試注釋术荤,用于指示應(yīng)在每次測(cè)試運(yùn)行后刪除并重新加載應(yīng)用程序上下文緩存倚喂。 刪除的應(yīng)用程序上下文也將被關(guān)閉。@DirtiesContext可以在方法級(jí)別和類級(jí)別聲明瓣戚。
3.@DirtiesContext工作流程
如果測(cè)試方法使用@DirtiesContext注釋端圈,或者測(cè)試類使用@DirtiesContext注釋并且classMode設(shè)置為ClassMode.AFTER_EACH_TEST_METHOD,則測(cè)試上下文的應(yīng)用程序上下文將被標(biāo)記為臟并關(guān)閉子库。
如果在類級(jí)別聲明@DirtiesContext且classMode設(shè)置為ClassMode.AFTER_CLASS舱权,則在運(yùn)行測(cè)試類的所有測(cè)試之后將關(guān)閉應(yīng)用程序上下文。
4.解決問題
所以根據(jù)上面的了解仑嗅,我只需要在每個(gè)類上增加@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)即可保證每次運(yùn)行測(cè)試用例都會(huì)重新初始spring上下文宴倍。
5.最后
雖然使用@DirtiesContext,可以保證每個(gè)test class的執(zhí)行上下文的獨(dú)立性仓技、隔離性鸵贬,但是也會(huì)有讓測(cè)試運(yùn)行速度變慢的副作用。所以在使用@DirtiesContext前脖捻,弄清楚你是否真的需要使用它阔逼。
具體示例參考
https://www.javarticles.com/2016/03/spring-dirtiescontext-annotation-example.html