最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot Test詳解

 更新時間:2024年02月18日 10:00:30   作者:卡布奇諾-海晨  
Spring Test與JUnit等其他測試框架結(jié)合起來,提供了便捷高效的測試手段,而Spring Boot Test 是在Spring Test之上的再次封裝,增加了切片測試,增強了mock能力,這篇文章主要介紹了Spring Boot Test介紹,需要的朋友可以參考下

一、Spring Boot Test介紹

Spring Test與JUnit等其他測試框架結(jié)合起來,提供了便捷高效的測試手段。而Spring Boot Test 是在Spring Test之上的再次封裝,增加了切片測試,增強了mock能力。

整體上,Spring Boot Test支持的測試種類,大致可以分為如下三類:

  • 單元測試:一般面向方法,編寫一般業(yè)務(wù)代碼時,測試成本較大。涉及到的注解有@Test。
  • 切片測試:一般面向難于測試的邊界功能,介于單元測試和功能測試之間。涉及到的注解有@RunWith @WebMvcTest等。
  • 功能測試:一般面向某個完整的業(yè)務(wù)功能,同時也可以使用切面測試中的mock能力,推薦使用。涉及到的注解有@RunWith @SpringBootTest等。

功能測試過程中的幾個關(guān)鍵要素及支撐方式如下:

  • 測試運行環(huán)境:通過@RunWith 和 @SpringBootTest啟動spring容器。
  • mock能力:Mockito提供了強大mock功能。
  • 斷言能力:AssertJ、Hamcrest、JsonPath提供了強大的斷言能力。

二、快速開始

增加spring-boot-starter-test依賴,使用@RunWith和@SpringBootTest注解,即可開始測試。

添加依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.2.13.RELEASE</version>
            <scope>test</scope>
        </dependency>

一旦依賴了spring-boot-starter-test,下面這些類庫將被一同依賴進去:

  • JUnit:java測試事實上的標(biāo)準(zhǔn),默認依賴版本是4.12(JUnit5和JUnit4差別比較大,集成方式有不同)。
  • Spring Test & Spring Boot Test:Spring的測試支持。
  • AssertJ:提供了流式的斷言方式。
  • Hamcrest:提供了豐富的matcher。
  • Mockito:mock框架,可以按類型創(chuàng)建mock對象,可以根據(jù)方法參數(shù)指定特定的響應(yīng),也支持對于mock調(diào)用過程的斷言。
  • JSONassert:為JSON提供了斷言功能。
  • JsonPath:為JSON提供了XPATH功能。

1. 單元測試

package com.ceam.aop.service;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SignUserServiceTest {
    @Autowired
    private SignLogService signLogService;
    @Test
    public void dod() {
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>"+signLogService.list());
    }
}

@RunWith是Junit4提供的注解,將Spring和Junit鏈接了起來。假如使用Junit5,不再需要使用@ExtendWith注解,@SpringBootTest和其它@*Test默認已經(jīng)包含了該注解。

@SpringBootTest替代了spring-test中的@ContextConfiguration注解,目的是加載ApplicationContext,啟動spring容器。

使用@SpringBootTest時并沒有像@ContextConfiguration一樣顯示指定locations或classes屬性,原因在于@SpringBootTest注解會自動檢索程序的配置文件,檢索順序是從當(dāng)前包開始,逐級向上查找被@SpringBootApplication或@SpringBootConfiguration注解的類。

2. 功能測試

一般情況下,使用@SpringBootTest后,Spring將加載所有被管理的bean,基本等同于啟動了整個服務(wù),此時便可以開始功能測試。

由于web服務(wù)是最常見的服務(wù),且我們對于web服務(wù)的測試有一些特殊的期望,所以@SpringBootTest注解中,給出了webEnvironment參數(shù)指定了web的environment,該參數(shù)的值一共有四個可選值:

  • MOCK:此值為默認值,該類型提供一個mock環(huán)境,可以和@AutoConfigureMockMvc或@AutoConfigureWebTestClient搭配使用,開啟Mock相關(guān)的功能。注意此時內(nèi)嵌的服務(wù)(servlet容器)并沒有真正啟動,也不會監(jiān)聽web服務(wù)端口。
  • RANDOM_PORT:啟動一個真實的web服務(wù),監(jiān)聽一個隨機端口。
  • DEFINED_PORT:啟動一個真實的web服務(wù),監(jiān)聽一個定義好的端口(從application.properties讀?。?/li>
  • NONE:啟動一個非web的ApplicationContext,既不提供mock環(huán)境,也不提供真實的web服務(wù)。

注:如果當(dāng)前服務(wù)的classpath中沒有包含web相關(guān)的依賴,spring將啟動一個非web的ApplicationContext,此時的webEnvironment就沒有什么意義了。

3. 切片測試

所謂切片測試,官網(wǎng)文檔稱為 “slice” of your application,實際上是對一些特定組件的稱呼。這里的slice并非單獨的類(畢竟普通類只需要基于JUnit的單元測試即可),而是介于單元測試和集成測試中間的范圍。

slice是指一些在特定環(huán)境下才能執(zhí)行的模塊,比如MVC中的Controller、JDBC數(shù)據(jù)庫訪問、Redis客戶端等,這些模塊大多脫離特定環(huán)境后不能獨立運行,假如spring沒有為此提供測試支持,開發(fā)者只能啟動完整服務(wù)對這些模塊進行測試,這在一些復(fù)雜的系統(tǒng)中非常不方便,所以spring為這些模塊提供了測試支持,使開發(fā)者有能力單獨對這些模塊進行測試。

通過@*Test開啟具體模塊的測試支持,開啟后spring僅加載相關(guān)的bean,無關(guān)內(nèi)容不會被加載。

使用@WebMvcTest用來校驗controllers是否正常工作的示例:

@RunWith(SpringRunner.class)
@WebMvcTest(IndexController.class)
public class SpringBootTest {
    @Autowired
    private MockMvc mvc;
    @Test
    public void testExample() throws Exception {
        //groupManager訪問路徑
        //param傳入?yún)?shù)
        MvcResult result=mvc.perform(MockMvcRequestBuilders.post("/groupManager").param("pageNum","1").param("pageSize","10")).andReturn();
        MockHttpServletResponse response = result.getResponse();
        String content = response.getContentAsString();
        List<JtInfoDto> jtInfoDtoList = GsonUtils.toObjects(content, new TypeToken<List<JtInfoDto>>() {}.getType());
        for(JtInfoDto infoDto : jtInfoDtoList){
            System.out.println(infoDto.getJtCode());
        }
    }
}

使用@WebMvcTest和MockMvc搭配使用,可以在不啟動web容器的情況下,對Controller進行測試(注意:僅僅只是對controller進行簡單的測試,如果Controller中依賴用@Autowired注入的service、dao等則不能這樣測試)。

三、注解詳解

Spring為了避免的繁瑣難懂的xml配置,引入大量annotation進行系統(tǒng)配置,確實減輕了配置工作量。由此,理解這些annotation變得尤為重要,一定程度上講,對Spring Boot Test的使用,就是對其相關(guān)annotation的使用。

1. 按功能分類

從功能上講,Spring Boot Test中的注解主要分如下幾類:

  • 配置類型:@TestConfiguration等。提供一些測試相關(guān)的配置入口。
  • mock類型:@MockBean等。提供mock支持。
  • 啟動測試類型:@SpringBootTest。以Test結(jié)尾的注解,具有加載applicationContext的能力。
  • 自動配置類型:@AutoConfigureJdbc等。以AutoConfigure開頭的注解,具有加載測試支持功能的能力。

(1) 配置類型的注解

  • @TestComponent:該注解是另一種@Component,在語義上用來指定某個Bean是專門用于測試的。該注解適用于測試代碼和正式混合在一起時,不加載被該注解描述的Bean,使用不多。
  • @TestConfiguration:該注解是另一種@TestComponent,它用于補充額外的Bean或覆蓋已存在的Bean。在不修改正式代碼的前提下,使配置更加靈活。
  • @TypeExcludeFilters:用來排除@TestConfiguration和@TestComponent。適用于測試代碼和正式代碼混合的場景,使用不多。
  • @OverrideAutoConfiguration:可用于覆蓋@EnableAutoConfiguration,與ImportAutoConfiguration結(jié)合使用,以限制所加載的自動配置類。在不修改正式代碼的前提下,提供了修改配置自動配置類的能力。
  • @PropertyMapping:定義@AutoConfigure*注解中用到的變量名稱,例如在@AutoConfigureMockMvc中定義名為spring.test.mockmvc.webclient.enabled的變量。一般不使用。

使用@SpringBootApplication啟動測試或者生產(chǎn)代碼,被@TestComponent描述的Bean會自動被排除掉。如果不是則需要向@SpringBootApplication添加TypeExcludeFilter。

(2) mock類型的注解

  • @MockBean:用于mock指定的class或被注解的屬性。
  • @MockBeans:使@MockBean支持在同一類型或?qū)傩陨隙啻纬霈F(xiàn)。
  • @SpyBean:用于spy指定的class或被注解的屬性。
  • @SpyBeans:使@SpyBean支持在同一類型或?qū)傩陨隙啻纬霈F(xiàn)

@MockBean@SpyBean這兩個注解,在mockito框架中本來已經(jīng)存在,且功能基本相同。Spring Boot Test又定義一份重復(fù)的注解,目的在于使MockBeanSpyBean被ApplicationContext管理,從而方便使用。

MockBean和SpyBean功能非常相似,都能模擬方法的各種行為。不同之處在于MockBean是全新的對象,跟正式對象沒有關(guān)系;而SpyBean與正式對象緊密聯(lián)系,可以模擬正式對象的部分方法,沒有被模擬的方法仍然可以運行正式代碼。

(3) 自動配置類型的注解(@AutoConfigure*)

  • @AutoConfigureJdbc 自動配置JDBC
  • @AutoConfigureCache 自動配置緩存
  • @AutoConfigureDataLdap 自動配置LDAP
  • @AutoConfigureJson 自動配置JSON
  • @AutoConfigureJsonTesters 自動配置JsonTester
  • @AutoConfigureDataJpa 自動配置JPA
  • @AutoConfigureTestEntityManager 自動配置TestEntityManager
  • @AutoConfigureRestDocs 自動配置Rest Docs
  • @AutoConfigureMockRestServiceServer 自動配置 MockRestServiceServer
  • @AutoConfigureWebClient 自動配置 WebClient
  • @AutoConfigureWebFlux 自動配置 WebFlux
  • @AutoConfigureWebTestClient 自動配置 WebTestClient
  • @AutoConfigureMockMvc 自動配置 MockMvc
  • @AutoConfigureWebMvc 自動配置WebMvc
  • @AutoConfigureDataNeo4j 自動配置 Neo4j
  • @AutoConfigureDataRedis 自動配置 Redis
  • @AutoConfigureJooq 自動配置 Jooq
  • @AutoConfigureTestDatabase 自動配置Test Database,可以使用內(nèi)存數(shù)據(jù)庫

這些注解可以搭配@\*Test使用,用于開啟在@\*Test中未自動配置的功能。例如@SpringBootTest@AutoConfigureMockMvc組合后,就可以注入org.springframework.test.web.servlet.MockMvc。

自動配置類型有兩種方式:

  • 功能測試(即使用@SpringBootTest)時顯示添加。
  • 一般在切片測試中被隱式使用,例如@WebMvcTest注解時,隱式添加了@AutoConfigureCache@AutoConfigureWebMvc、@AutoConfigureMockMvc

(4) 啟動測試類型的注解(@*Test)

所有的@*Test注解都被@BootstrapWith注解,它們可以啟動ApplicationContext,是測試的入口,所有的測試類必須聲明一個@*Test注解。

  • @SpringBootTest 自動偵測并加載@SpringBootApplication或@SpringBootConfiguration中的配置,默認web環(huán)境為MOCK,不監(jiān)聽任務(wù)端口
  • @DataRedisTest 測試對Redis操作,自動掃描被@RedisHash描述的類,并配置Spring Data Redis的庫
  • @DataJpaTest 測試基于JPA的數(shù)據(jù)庫操作,同時提供了TestEntityManager替代JPA的EntityManager 
  • @DataJdbcTest 測試基于Spring Data JDBC的數(shù)據(jù)庫操作
  • @JsonTest 測試JSON的序列化和反序列化
  • @WebMvcTest 測試Spring MVC中的controllers
  • @WebFluxTest 測試Spring WebFlux中的controllers
  • @RestClientTest 測試對REST客戶端的操作
  • @DataLdapTest 測試對LDAP的操作
  • @DataMongoTest 測試對MongoDB的操作
  • @DataNeo4jTest 測試對Neo4j的操作

除了@SpringBootTest之外的注解都是用來進行切面測試的,他們會默認導(dǎo)入一些自動配。

一般情況下,推薦使用@SpringBootTest而非其它切片測試的注解,簡單有效。若某次改動僅涉及特定切片,可以考慮使用切片測試。

@SpringBootTest是這些注解中最常用的一個,其中包含的配置項如下:

  • value 指定配置屬性
  • properties 指定配置屬性,和value意義相同
  • classes 指定配置類,等同于@ContextConfiguration中的class,若沒有顯示指定,將查找嵌套的@Configuration類,然后返回到SpringBootConfiguration搜索配置
  • webEnvironment 指定web環(huán)境,可選值有:MOCK、RANDOM_PORT、DEFINED_PORT、NONE

webEnvironment詳細說明:

  • MOCK 此值為默認值,該類型提供一個mock環(huán)境,此時內(nèi)嵌的服務(wù)(servlet容器)并沒有真正啟動,也不會監(jiān)聽web端口。
  • RANDOM_PORT 啟動一個真實的web服務(wù),監(jiān)聽一個隨機端口。
  • DEFINED_PORT 啟動一個真實的web服務(wù),監(jiān)聽一個定義好的端口(從配置中讀?。?/li>
  • NONE 啟動一個非web的ApplicationContext,既不提供mock環(huán)境,也不提供真是的web服務(wù)。

2. 相互之間的搭配組合

package sample.test;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import sample.test.domain.VehicleIdentificationNumber;
import sample.test.service.VehicleDetails;
import sample.test.service.VehicleDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import static org.mockito.BDDMockito.given;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureTestDatabase
public class SampleTestApplicationWebIntegrationTests {
    private static final VehicleIdentificationNumber VIN = new VehicleIdentificationNumber(
            "01234567890123456");
    @Autowired
    private TestRestTemplate restTemplate;
    @MockBean
    private VehicleDetailsService vehicleDetailsService;
    @Before
    public void setup() {
        given(this.vehicleDetailsService.getVehicleDetails(VIN))
                .willReturn(new VehicleDetails("Honda", "Civic"));
    }
    @Test
    public void test() {
        this.restTemplate.getForEntity("/{username}/vehicle", String.class, "sframework");
    }
}
  • @RunWith(SpringRunner.class)是JUnit的注解,作用是關(guān)聯(lián)Spring Boot Test,使運行JUnit時同時啟動Spring
  • @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 作用是啟動Spring的ApplicationContext,參數(shù)webEnvironment指定了運行的web環(huán)境
  • @AutoConfigureTestDatabase 作用是啟動一個內(nèi)存數(shù)據(jù)庫,不使用真實的數(shù)據(jù)庫

其中@RunWith和@*Test必須存在,@AutoConfigure*可以同時配置任意多個,而配置類型的注解可以在需要時添加。

3. 相似注解的區(qū)別于聯(lián)系

(1) @TestComment vs @Comment

  • @TestComponent是另一種@Component,在語義上用來指定某個Bean是專門用于測試的
  • 使用@SpringBootApplication服務(wù)時,@TestComponent會被自動排除

(2) @TestConfiguration vs @Configuration

  • @TestConfiguration是Spring Boot Boot Test提供的,@Configuration是Spring Framework提供的。
  • @TestConfiguration實際上是也是一種@TestComponent,只是這個@TestComponent專門用來做配置用。
  • @TestConfiguration@Configuration不同,它不會阻止@SpringBootTest的查找機制,相當(dāng)于是對既有配置的補充或覆蓋。

(3) @SpringBootTest vs @WebMvcTest(或@*Test)

  • 都可以啟動Spring的ApplicationContext
  • @SpringBootTest自動偵測并加載@SpringBootApplication或@SpringBootConfiguration中的配置,@WebMvcTest不偵測配置,只是默認加載一些自動配置。
  • @SpringBootTest測試范圍一般比@WebMvcTest大。

到此這篇關(guān)于Spring Boot Test介紹的文章就介紹到這了,更多相關(guān)Spring Boot Test內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot 自定義 Shiro 過濾器無法使用 @Autowired問題及解決方法

    Spring Boot 自定義 Shiro 過濾器無法使用 @Autowired問題及解決方法

    這篇文章主要介紹了Spring Boot 自定義 Shiro 過濾器無法使用 @Autowired問題及解決方法 ,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • 深入理解SpringMVC的參數(shù)綁定與數(shù)據(jù)響應(yīng)機制

    深入理解SpringMVC的參數(shù)綁定與數(shù)據(jù)響應(yīng)機制

    本文將深入探討SpringMVC的參數(shù)綁定方式,包括基本類型、對象、集合等類型的綁定方式,以及如何處理參數(shù)校驗和異常。同時,本文還將介紹SpringMVC的數(shù)據(jù)響應(yīng)機制,包括如何返回JSON、XML等格式的數(shù)據(jù),以及如何處理文件上傳和下載。
    2023-06-06
  • Spring中的InitializingBean接口的使用

    Spring中的InitializingBean接口的使用

    這篇文章主要介紹了Spring中的InitializingBean接口的使用,需要的朋友可以參考下
    2018-04-04
  • 解決mybatis映射mapper.xml文件不編譯的問題

    解決mybatis映射mapper.xml文件不編譯的問題

    這篇文章主要介紹了解決mybatis映射mapper.xml文件不編譯的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 基于SpringBoot + Redis Pub/Sub實現(xiàn)跨實例SSE消息推送

    基于SpringBoot + Redis Pub/Sub實現(xiàn)跨實例SSE消息推送

    在構(gòu)建Web應(yīng)用時,消息推送是一個常見需求——比如站內(nèi)信、訂單狀態(tài)更新、告警通知等,SSE相比WebSocket更輕量,適合單向推送場景,本文介紹一種基于Redis Pub/Sub的解決方案,讓SSE連接能夠跨實例互通,需要的朋友可以參考下
    2026-04-04
  • @FeignClient?實現(xiàn)簡便http請求封裝方式

    @FeignClient?實現(xiàn)簡便http請求封裝方式

    這篇文章主要介紹了@FeignClient?實現(xiàn)簡便http請求封裝方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • IntelliJ?IDEA無法識別JDK的環(huán)境變量配置問題排查與解決全流程

    IntelliJ?IDEA無法識別JDK的環(huán)境變量配置問題排查與解決全流程

    進行Java開發(fā)時,開發(fā)者可能會遇到各種與JDK版本相關(guān)的問題,這篇文章主要介紹了IntelliJ?IDEA無法識別JDK的環(huán)境變量配置問題排查與解決的相關(guān)資料,文中介紹的非常詳細,需要的朋友可以參考下
    2025-09-09
  • Java枚舉Enum從入門到實踐指南

    Java枚舉Enum從入門到實踐指南

    枚舉是Java中一個強大而實用的特性,它不僅可以用來定義常量,還可以實現(xiàn)復(fù)雜的業(yè)務(wù)邏輯,本文給大家介紹Java枚舉Enum從入門到實踐指南,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • Java中避免空指針異常的方法

    Java中避免空指針異常的方法

    這篇文章主要介紹了Java中避免空指針異常的方法,本文討論Optional類型、Objects類等技術(shù),需要的朋友可以參考下
    2014-10-10
  • SpringBoot中支持Https協(xié)議的實現(xiàn)

    SpringBoot中支持Https協(xié)議的實現(xiàn)

    本文主要介紹了SpringBoot中支持Https協(xié)議的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01

最新評論

南安市| 肇庆市| 安吉县| 固原市| 娄烦县| 三穗县| 望都县| 衡东县| 绥滨县| 六盘水市| 休宁县| 长寿区| 洛隆县| 宁陕县| 海口市| 卫辉市| 安义县| 扶余县| 阳泉市| 太原市| 浪卡子县| 离岛区| 甘孜县| 桐庐县| 台南市| 金阳县| 云梦县| 金乡县| 营山县| 麻阳| 安康市| 高唐县| 松溪县| 滦平县| 普兰县| 彰化县| 承德市| 枣庄市| 桃园市| 凉城县| 台东市|