欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

在編寫Springboot項(xiàng)目,如要對業(yè)務(wù)進(jìn)行測試時(shí),一般測試都是運(yùn)行項(xiàng)目,通過URL在postman或者chrome瀏覽器進(jìn)行測試,查看結(jié)果。

而當(dāng)項(xiàng)目十分大的時(shí)候,我們在測試的時(shí)候,浪費(fèi)的時(shí)間較多,因此我們通過使用SpringBoot MVC來進(jìn)行單元測試。

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

如何使用MockMVC單元測試

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

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

添加依賴

在項(xiàng)目的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)建一個(gè)新的測試類,例如MyServiceTest。

導(dǎo)入必要的類:在測試類中導(dǎo)入需要的類和注解。

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() {
    // 設(shè)置Mock對象的行為
    when(myRepository.findById(1L)).thenReturn(Optional.of(new MyEntity()));
    
    // 調(diào)用被測試的方法
    MyEntity result = myService.findById(1L);
    
    // 斷言結(jié)果
    assertNotNull(result);
}

運(yùn)行測試

在測試類中右鍵點(diǎn)擊運(yùn)行測試方法,或者使用Maven命令運(yùn)行測試。

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

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

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) 是一個(gè)靜態(tài)方法,用于初始化當(dāng)前類的所有帶有
        @Mock 注解的 mock 對象。這個(gè)方法會自動(dòng)掃描當(dāng)前類中的所有字段,如果發(fā)現(xiàn)帶有 @Mock 注解的
        字段,就會自動(dòng)初始化該字段對應(yīng)的 mock 對象
         */
        MockitoAnnotations.initMocks(this);
        /*
        mockMvc = MockMvcBuilders.standaloneSetup(classificationController) 創(chuàng)建了一個(gè)
        MockMvc 實(shí)例,用于模擬 Spring MVC 的請求和響應(yīng)。classificationController 是被測試的
        控制器對象。

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

    @Test
    public void add() throws Exception {
        /*
        MockMvc 是一個(gè)用于模擬 Spring MVC 請求和響應(yīng)的類。通過 mockMvc.perform() 方法,
        可以創(chuàng)建一個(gè) 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(); //返回一個(gè)MvcResult對象
        int statusCode = result.getResponse().getStatus();
        String content = result.getResponse().getContentAsString();
        System.out.println("statusCode: "+statusCode);
        System.out.println("返回結(jié)果 content: "+content);
        Assert.assertEquals(200, statusCode);  //驗(yàn)證響應(yīng)狀態(tài)碼是否為200,表示請求成功
        /*
          驗(yàn)證classificationService是否被調(diào)用了一次,并且傳入的參數(shù)類型是ClassificationDto類型。
          這個(gè)方法用于確認(rèn)在測試用例執(zhí)行過程中,是否正確調(diào)用了相關(guān)的服務(wù)方法。
         */
        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("返回結(jié)果 content: "+content);
        Assert.assertEquals(200, statusCode);
        verify(classificationService,times(1)).update(any(ClassificationDto.class));
    }
}

總結(jié)

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

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

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

相關(guān)文章

  • SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁功能

    SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁功能

    在SpringBoot項(xiàng)目中,結(jié)合MyBatis-Plus(簡稱MP)可以非常方便地實(shí)現(xiàn)分頁功能,MP為開發(fā)者提供了分頁插件PaginationInterceptor,只需簡單配置即可使用,本文給大家介紹了SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁功能,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • springboot整合knife4j全過程

    springboot整合knife4j全過程

    這篇文章主要介紹了springboot整合knife4j全過程,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring Boot 實(shí)現(xiàn)https ssl免密登錄(X.509 pki登錄)

    Spring Boot 實(shí)現(xiàn)https ssl免密登錄(X.509 pki登錄)

    這篇文章主要介紹了Spring Boot 實(shí)現(xiàn)https ssl免密登錄(X.509 pki登錄),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 動(dòng)態(tài)代理模擬實(shí)現(xiàn)aop的示例

    動(dòng)態(tài)代理模擬實(shí)現(xiàn)aop的示例

    下面小編就為大家?guī)硪黄獎(jiǎng)討B(tài)代理模擬實(shí)現(xiàn)aop的示例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望對大家有所幫助
    2017-11-11
  • Seata?AT模式前后鏡像是如何生成詳解

    Seata?AT模式前后鏡像是如何生成詳解

    這篇文章主要為大家介紹了Seata?AT模式前后鏡像是如何生成的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 排序算法圖解之Java歸并排序的實(shí)現(xiàn)

    排序算法圖解之Java歸并排序的實(shí)現(xiàn)

    歸并排序是建立在歸并操作上的一種有效,穩(wěn)定的排序算法,該算法是采用分治法(Divide?and?Conquer)的一個(gè)非常典型的應(yīng)用。本文主要介紹了歸并排序的實(shí)現(xiàn),需要的可以參考一下
    2022-11-11
  • springboot操作ldap全過程

    springboot操作ldap全過程

    這篇文章主要介紹了springboot操作ldap全過程,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • java睡眠排序算法示例實(shí)現(xiàn)

    java睡眠排序算法示例實(shí)現(xiàn)

    這篇文章主要為大家介紹了java睡眠排序算法的示例實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • 總結(jié)Java的Struts框架的異常處理方法

    總結(jié)Java的Struts框架的異常處理方法

    這篇文章主要介紹了Java的Struts框架的異常處理方法,Struts是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • Java常用類之System類的使用指南

    Java常用類之System類的使用指南

    System類代表系統(tǒng),系統(tǒng)級的很多屬性和控制方法都放置在該類的內(nèi)部。該類位于java.lang包。本文將通過示例為大家詳細(xì)講講System類的使用,需要的可以參考一下
    2022-07-07

最新評論