知識(shí)鋪: 致力于打造輕知識(shí)點(diǎn),,持續(xù)更新每次的知識(shí)點(diǎn)較少,閱讀不累,。不占太多時(shí)間,,不停地來(lái)喚醒你記憶深處的知識(shí)點(diǎn)。 一.單元測(cè)試與集成測(cè)試 學(xué)習(xí)在Spring Boot應(yīng)用程序中編寫單元測(cè)試和集成測(cè)試,。了解單元測(cè)試和集成測(cè)試之間的區(qū)別,,以及支持此類測(cè)試的注解。 1.1 單元測(cè)試: 通常,,任何軟件應(yīng)用程序都分為不同的模塊和組件,。單獨(dú)測(cè)試一個(gè)這樣的組件時(shí),稱為單元測(cè)試,。編寫該代碼是為了驗(yàn)證一小段代碼是否正在執(zhí)行預(yù)期的操作,。 單元測(cè)試不能驗(yàn)證應(yīng)用程序代碼是否正確地與外部依賴項(xiàng)一起工作。它專注于單個(gè)組件并模擬與該組件交互的所有依賴項(xiàng),。 1.2 集成測(cè)試: 一旦開發(fā)并集成了不同的模塊,,便會(huì)執(zhí)行集成測(cè)試。其主要目的是發(fā)現(xiàn)不同模塊相互交互以端對(duì)端處理用戶請(qǐng)求時(shí)的問(wèn)題,。 集成測(cè)試可以根據(jù)測(cè)試內(nèi)容將整個(gè)應(yīng)用程序進(jìn)行集成測(cè)試,,也可以僅將某些組件進(jìn)行集成測(cè)試。他們可能需要為數(shù)據(jù)庫(kù)實(shí)例和分配資源,。盡管也可以模擬這些交互以提高測(cè)試性能,。 就典型的Spring boot CRUD應(yīng)用,可以編寫單元測(cè)試來(lái)分別測(cè)試REST控制器,,DAO層等,。甚至不需要嵌入式服務(wù)器。 在集成測(cè)試中,,將測(cè)試從控制器到持久層的完整請(qǐng)求處理,。應(yīng)用程序嵌入式服務(wù)器中運(yùn)行,以創(chuàng)建應(yīng)用程序上下文和所有bean,。這些bean中的某些可能會(huì)被覆蓋以模擬某些行為,。 二、依賴關(guān)系 2.1 Junit 4測(cè)試(默認(rèn)) 要在Spring Boot應(yīng)用程序中編寫測(cè)試,,最好的方法引入測(cè)試包: spring-boot-starter-test,。它把Junit 4依賴項(xiàng)帶到具有測(cè)試范圍的應(yīng)用程序中,。
2.2。Junit 5測(cè)試 Spring Boot也支持Junit 5測(cè)試,。要使用Junit 5,,請(qǐng)包括它的依賴項(xiàng),并從spring-boot-starter-test中排除Junit 4 ,。 編寫集成測(cè)試時(shí),,嵌入式數(shù)據(jù)庫(kù)依賴關(guān)系非常方便。
三.啟動(dòng)測(cè)試 用Spring Boot編寫的測(cè)試可以多種方式運(yùn)行,。讓來(lái)看看幾種最常見的方式,。 3.1。@RunWith(SpringRunner.class)– [Junit 4] 默認(rèn)情況下,,編寫的測(cè)試是在Junit 4中進(jìn)行的,。要運(yùn)行此類測(cè)試,可以在類級(jí)別使用帶有批注的SpringRunner類(擴(kuò)展SpringJUnit4ClassRunner)@RunWith,。
3.2,。@RunWith(MockitoJUnitRunner.class)– [Junit 4 with Mockito] 它@Mock使用MockitoJUnitRunner測(cè)試首選對(duì)象。它初始化帶有Mock注解的模擬,,因此MockitoAnnotations.initMocks(Object)不需要顯式使用,。在每種測(cè)試方法之前都要初始化模擬。
3.3,。@ExtendWith(SpringExtension.class)– [Junit 5] SpringExtension將Spring TestContext Framework集成到JUnit 5的Jupiter編程模型中。
3.4,。@ExtendWith(MockitoExtension.class)– [Junit 5] MockitoExtension初始化模擬并處理嚴(yán)格的存根,。等同于MockitoJUnitRunner。 大多數(shù)測(cè)試注解都包含此注解,,因此無(wú)需明確包含它,。
四、 Spring Boot 測(cè)試注解 Spring Boot提供了各種注解,,以啟用僅與應(yīng)用程序的某些部分相關(guān)的測(cè)試基礎(chǔ)結(jié)構(gòu),。它還提供了注解,這些注解也有助于集成測(cè)試,。 4.1,。@SpringBootTest 此批注有助于編寫集成測(cè)試。它啟動(dòng)嵌入式服務(wù)器并完全初始化應(yīng)用程序上下文,??梢允褂聾Autowired批注將依賴項(xiàng)注入測(cè)試類中。 還可以使用嵌套的@Configuration類或顯式的@TestConfiguration類提供特定于測(cè)試的bean裝配,。 它還為不同的web環(huán)境模式提供特定環(huán)境支持,,并在定義的或隨機(jī)的端口上偵聽正在運(yùn)行的Web服務(wù)器。它還注冊(cè)了TestRestTemplate和/或WebTestClient的bean,,用于Web測(cè)試,。
4.2,。@WebMvcTest 該注解用于Spring MVC測(cè)試。它禁用完全自動(dòng)裝配,,而是僅應(yīng)用與MVC測(cè)試相關(guān)的裝配。 它還會(huì)自動(dòng)裝配MockMvc實(shí)例,。通過(guò)將其目標(biāo)類.class作為注入屬性,只能初始化一個(gè)Web控制器,。
4.3。@WebFluxTest 此注解將禁用完全自動(dòng)裝配,,而僅應(yīng)用與WebFlux測(cè)試相關(guān)的裝配。默認(rèn)情況下,,用@WebFluxTest注解的測(cè)試還將自動(dòng)裝配WebTestClient。 通常,,@ WebFluxTest與@MockBean結(jié)合使用,或@Import創(chuàng)建控制器bean所需的任何協(xié)作者,。
4.4。其他常用注解
五.測(cè)試裝配 @TestConfiguration是一種特殊的形式@Configuration,,可用于定義其他bean或測(cè)試的自定義項(xiàng),。 在Spring啟動(dòng)中,,@TestConfiguration將不會(huì)通過(guò)組件掃描來(lái)拾取在頂級(jí)類中裝配有注解的任何bean ,。必須使用包含測(cè)試用例的類顯式注冊(cè)@TestConfiguration類。 最好的是,,這些測(cè)試裝配不會(huì)自動(dòng)成為應(yīng)用程序主裝配的一部分。僅可使用以下兩種方式之一按需提供這些附加測(cè)試裝配,,即: 5.1,。@導(dǎo)入注解 它稱為將一個(gè)或多個(gè)裝配類導(dǎo)入應(yīng)用程序上下文或Spring測(cè)試上下文中。
5.2,。靜態(tài)嵌套類 可以在測(cè)試類內(nèi)部的嵌套類中定義測(cè)試裝配,。嵌套類可以使用@Configuration或@TestConfiguration批注進(jìn)行注解。 如果是嵌套@Configuration類,,則將使用給定的裝配“代替”應(yīng)用程序的主要裝配,。 嵌套@TestConfiguration類用于“附加”應(yīng)用程序的主要裝配。
六.模擬 mock測(cè)試數(shù)據(jù) 對(duì)于使用或不使用Mockito的依賴關(guān)系,,Spring Boot都提供了出色的支持,。 6.1。與Mockito結(jié)合 – @Mock @Mock用于模擬創(chuàng)建,。它使測(cè)試類更具可讀性,。在測(cè)試類中,,MockitoAnnotations.initMocks(testClass)必須至少使用一次以處理模仿注解,。 請(qǐng)注意,如果正在使用,,RunWith(MockitoJUnitRunner.class)則無(wú)需顯式使用MockitoAnnotations.initMocks(),。在每種測(cè)試方法之前都要初始化模擬。 用于@Mock不需要Spring文本上下文的單元測(cè)試中,。 6.2。沒有Mockito – @MockBean @MockBean批注用于將模擬添加到Spring ApplicationContext,。它允許模擬類或接口,并記錄和驗(yàn)證其行為,。 有趣的是,,上下文中定義的任何相同類型的現(xiàn)有bean都將被該模擬代替,。如果沒有定義現(xiàn)有的bean,將添加一個(gè)新的bean,。 @MockBean與mockito的相似,,@Mock但具有Spring支持。通常會(huì)使用@MockBean連同任一@WebMvcTest或@WebFluxTest注解,。這些注解適用于Web測(cè)試片,,并且僅限于單個(gè)控制器。 在給定的示例中,,在模擬EmployeeRepository的bean中,。這樣,將調(diào)用所有應(yīng)用程序代碼,,但是這也只是模擬所有與數(shù)據(jù)庫(kù)交互方式,。
七.結(jié)論 Spring Boot為應(yīng)用程序及其各種模塊的單元測(cè)試和集成測(cè)試提供了出色的支持。將非常小心地通過(guò)使用注解來(lái)使用所提供的支持,。 使用@SpringBootTest注解進(jìn)行集成測(cè)試,,而使用其他自動(dòng)裝配批注進(jìn)行特定組件的單元測(cè)試。 模擬特定行為是非常普遍的要求,,為此,,可以使用模擬的@Mock或Spring的@MockBean注解。 |
|