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

SpringBoot中MockMVC單元測試的實現(xiàn)

 更新時間:2024年02月05日 10:44:44   作者:一唸辶間  
Mock是一種用于模擬和替換類的對象的方法,以便在單元測試中獨立于外部資源進行測試,本文主要介紹了SpringBoot中MockMVC單元測試的實現(xiàn),具有應該的參考價值,感興趣的可以了解一下

在編寫Springboot項目,如要對業(yè)務進行測試時,一般測試都是運行項目,通過URL在postman或者chrome瀏覽器進行測試,查看結果。

而當項目十分大的時候,我們在測試的時候,浪費的時間較多,因此我們通過使用SpringBoot MVC來進行單元測試。

可以實現(xiàn)對Http請求的模擬,能夠直接使用網(wǎng)絡的形式,轉換到Controller的調用,這樣可以使得測試速度快、不依賴網(wǎng)絡環(huán)境,而且提供了一套驗證的工具,這樣可以使得請求的驗證統(tǒng)一而且很方便。

如何使用MockMVC單元測試

Mock是一種用于模擬和替換類的對象的方法,以便在單元測試中獨立于外部資源進行測試。使用Mock可以模擬各種對象,包括數(shù)據(jù)庫連接、網(wǎng)絡請求、外部服務調用等,以便在測試中檢查代碼的行為和輸出。

以下是如何使用Mock來編寫單元測試的步驟:

添加依賴

在項目的pom.xml文件中添加Mockito和JUnit的依賴。

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.12.4</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.8.1</version>
    <scope>test</scope>
</dependency>

創(chuàng)建測試類

在測試目錄下創(chuàng)建一個新的測試類,例如MyServiceTest。

導入必要的類:在測試類中導入需要的類和注解。

import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

創(chuàng)建Mock對象

在測試類中使用@Mock注解創(chuàng)建需要Mock的對象。

@Mock
private MyRepository myRepository;

初始化Mock對象

在測試類的@BeforeEach或@Before方法中初始化Mock對象。

@BeforeEach
void setUp() {
    MockitoAnnotations.openMocks(this);
}

創(chuàng)建被測試的對象

在測試類中使用@InjectMocks注解創(chuàng)建被測試的對象,并將Mock對象注入到被測試對象中。

@InjectMocks
private MyService myService;

編寫測試方法

在測試類中編寫測試方法,并使用Mock對象來模擬需要的行為。

@Test
void testSomeMethod() {
    // 設置Mock對象的行為
    when(myRepository.findById(1L)).thenReturn(Optional.of(new MyEntity()));
    
    // 調用被測試的方法
    MyEntity result = myService.findById(1L);
    
    // 斷言結果
    assertNotNull(result);
}

運行測試

在測試類中右鍵點擊運行測試方法,或者使用Maven命令運行測試。

這樣就可以使用Mockito和JUnit來編寫單元測試了。Mockito提供了豐富的API來模擬對象的行為,使得單元測試更加簡單和可控。

下面是某個模塊的增加和更新操作測試相關代碼如下(示例):

public class ClassificationControllerTest {
    @InjectMocks
    private ClassificationController classificationController;
    
    private MockMvc mockMvc;
    @Mock
    private ClassificationService classificationService;
    
    private ClassificationDto classificationDto;
    
    private Gson gson = new Gson();

    @Before
    public void before(){
        /*
        首先,MockitoAnnotations.initMocks(this) 是一個靜態(tài)方法,用于初始化當前類的所有帶有
        @Mock 注解的 mock 對象。這個方法會自動掃描當前類中的所有字段,如果發(fā)現(xiàn)帶有 @Mock 注解的
        字段,就會自動初始化該字段對應的 mock 對象
         */
        MockitoAnnotations.initMocks(this);
        /*
        mockMvc = MockMvcBuilders.standaloneSetup(classificationController) 創(chuàng)建了一個
        MockMvc 實例,用于模擬 Spring MVC 的請求和響應。classificationController 是被測試的
        控制器對象。

        setControllerAdvice(new LocalExceptionAspect(), new GlobalExceptionHandler())
        方法設置了兩個 advices,用于處理控制器中拋出的異常。LocalExceptionAspect 是本地異常處理,
        GlobalExceptionHandler 是全局異常處理。
         */
        mockMvc = MockMvcBuilders.standaloneSetup(classificationController)
                .setControllerAdvice(new LocalExceptionAspect(), new GlobalExceptionHandler())
                .build();
        classificationDto = new ClassificationDto();
        classificationDto.setName("Test-Test");
        classificationDto.setDescription("這是一個測試");
        classificationDto.setColour("#ccc119");
    }

    @Test
    public void add() throws Exception {
        /*
        MockMvc 是一個用于模擬 Spring MVC 請求和響應的類。通過 mockMvc.perform() 方法,
        可以創(chuàng)建一個 MockMvc 請求對象,并指定請求的 URL、請求方法、請求頭、請求體等參數(shù)。
         */
        MvcResult result= mockMvc.perform(MockMvcRequestBuilders.post("/classification/add") //請求方法為post ,請求的url
                        .accept(MediaType.APPLICATION_JSON) // 指定請求頭Accept   指定請求頭Content-Type
                        .contentType(MediaType.APPLICATION_JSON).content(gson.toJson(classificationDto))) //方法指定請求體位xxx對象的json字符串表示
                .andReturn(); //返回一個MvcResult對象
        int statusCode = result.getResponse().getStatus();
        String content = result.getResponse().getContentAsString();
        System.out.println("statusCode: "+statusCode);
        System.out.println("返回結果 content: "+content);
        Assert.assertEquals(200, statusCode);  //驗證響應狀態(tài)碼是否為200,表示請求成功
        /*
          驗證classificationService是否被調用了一次,并且傳入的參數(shù)類型是ClassificationDto類型。
          這個方法用于確認在測試用例執(zhí)行過程中,是否正確調用了相關的服務方法。
         */
        verify(classificationService,times(1)).add(any(ClassificationDto.class));
    }

    @Test
    public void update() throws Exception {
        classificationDto.setId(119L);
        MvcResult result= mockMvc.perform(MockMvcRequestBuilders.put("/classification/update")
                        .accept(MediaType.APPLICATION_JSON)
                        .contentType(MediaType.APPLICATION_JSON).content(gson.toJson(classificationDto)))
                .andReturn();
        int statusCode = result.getResponse().getStatus();
        String content = result.getResponse().getContentAsString();
        System.out.println("statusCode: "+statusCode);
        System.out.println("返回結果 content: "+content);
        Assert.assertEquals(200, statusCode);
        verify(classificationService,times(1)).update(any(ClassificationDto.class));
    }
}

總結

在上面的示例代碼中,我們首先使用了@Mock和@InjectMock注解來創(chuàng)建Mock對象并注入到測試類中。然后,我們可以定義了Mock對象的期望行為,當被調用時,返回一個包含測試數(shù)據(jù)的Optional對象。接下來,我們調用了被測試的方法,并獲取了返回值。最后,我們使用斷言語句來檢查方法的行為和輸出,包括驗證被調用了一次,并驗證返回值是否符合預期。

使用Mock可以有效地模擬外部依賴,使測試更加可控和可重復。這有助于提高測試的可靠性,并幫助開發(fā)人員更好地理解代碼的行為和輸出。

到此這篇關于SpringBoot中MockMVC單元測試的實現(xiàn)的文章就介紹到這了,更多相關SpringBoot MockMVC單元測試內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java使用Hutool+自定義注解實現(xiàn)數(shù)據(jù)脫敏

    Java使用Hutool+自定義注解實現(xiàn)數(shù)據(jù)脫敏

    我們在使用手機銀行的時候經(jīng)常能看到APP上會將銀行卡的卡號中間部分給隱藏掉使用 ***** 來代替,在某些網(wǎng)站上查看一些業(yè)務密碼時(例如簽到密碼等)也會使用 ***** 來隱藏掉真正的密碼,那么這種方式是如何實現(xiàn)的呢,本文將給大家介紹使用Hutool+自定義注解實現(xiàn)數(shù)據(jù)脫敏
    2023-09-09
  • 淺談Java中BIO、NIO和AIO的區(qū)別和應用場景

    淺談Java中BIO、NIO和AIO的區(qū)別和應用場景

    這篇文章主要介紹了Java中BIO、NIO和AIO的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • java工廠實例BeanFactoryPostProcessor和BeanPostProcessor區(qū)別分析

    java工廠實例BeanFactoryPostProcessor和BeanPostProcessor區(qū)別分析

    這篇文章主要為大家介紹了BeanFactoryPostProcessor和BeanPostProcessor區(qū)別示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • NIO深入理解FileChannel使用方法原理

    NIO深入理解FileChannel使用方法原理

    這篇文章主要為大家介紹了NIO深入理解FileChannel的源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 基于Java實現(xiàn)Word轉EPUB的實現(xiàn)方案詳解

    基于Java實現(xiàn)Word轉EPUB的實現(xiàn)方案詳解

    EPUB作為一種開放標準的電子書格式,已成為數(shù)字出版領域的主流選擇,本文將介紹一種基于?Java?的實現(xiàn)方案,供有類似需求的朋友參考,希望對大家有所幫助
    2026-04-04
  • C語言指針數(shù)組案例詳解

    C語言指針數(shù)組案例詳解

    這篇文章主要介紹了C語言指針數(shù)組案例詳解,本文通過案例詳細的解釋了指針與數(shù)組的初始化還有關系與應用,需要的朋友可以參考下這篇文章
    2021-07-07
  • 關于動態(tài)參數(shù)使用@PathVariable的解析

    關于動態(tài)參數(shù)使用@PathVariable的解析

    這篇文章主要介紹了關于動態(tài)參數(shù)使用@PathVariable的解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 在RabbitMQ中實現(xiàn)Work queues工作隊列模式

    在RabbitMQ中實現(xiàn)Work queues工作隊列模式

    這篇文章主要介紹了如何在RabbitMQ中實現(xiàn)Work queues模式,代碼詳細,解釋清晰,可以幫助大家更好理解java,對這方面感興趣的朋友可以參考下
    2021-04-04
  • SpringBoot2.X Devtools熱部署實現(xiàn)解析

    SpringBoot2.X Devtools熱部署實現(xiàn)解析

    這篇文章主要介紹了SpringBoot2.X Devtools熱部署實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • JPA如何使用nativequery多表關聯(lián)查詢返回自定義實體類

    JPA如何使用nativequery多表關聯(lián)查詢返回自定義實體類

    這篇文章主要介紹了JPA如何使用nativequery多表關聯(lián)查詢返回自定義實體類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

康马县| 饶平县| 南宫市| 根河市| 高邑县| 泊头市| 涪陵区| 司法| 志丹县| 民县| 通榆县| 额尔古纳市| 基隆市| 杂多县| 巴楚县| 威宁| 垣曲县| 沙洋县| 康平县| 承德县| 东乡族自治县| 重庆市| 靖宇县| 塔河县| 获嘉县| 石首市| 漳州市| 辽宁省| 乌审旗| 安龙县| 泗水县| 离岛区| 岱山县| 增城市| 南川市| 三穗县| 罗源县| 顺昌县| 青神县| 武汉市| 晋州市|