日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

深度揭秘JUnit5與Mockito的單元測試神秘面紗

來源: 責編: 時間:2024-01-02 09:31:59 261觀看
導讀在今天的學習中,我們將深入研究JUnit和Mockito,這是Java開發中最強大的單元測試工具之一。通過學習如何編寫清晰、高效的單元測試,我們將揭開單元測試的神秘面紗,助力你在項目中寫出更健壯的代碼。提示: 今天的代碼是在第

在今天的學習中,我們將深入研究JUnit和Mockito,這是Java開發中最強大的單元測試工具之一。通過學習如何編寫清晰、高效的單元測試,我們將揭開單元測試的神秘面紗,助力你在項目中寫出更健壯的代碼。VDZ28資訊網——每日最新資訊28at.com

提示: 今天的代碼是在第九天代碼的基礎上進行開發,我們將為UserController中添加更多的單元測試方法,以展示JUnit和Mockito的強大功能。VDZ28資訊網——每日最新資訊28at.com

核心知識介紹:

Unit 5 的主要特性和注解:@Test:標記方法作為測試方法。@BeforeEach / @AfterEach:分別表示在每個測試方法前后運行的方法。@BeforeAll / @AfterAll:分別表示在所有測試開始之前和所有測試結束之后只運行一次的方法。@DisplayName:為測試類或測試方法定義一個自定義的顯示名稱。@Nested:表示內部類,其成員方法可以作為嵌套的測試類進行分組。@Tag:為測試方法添加標簽,可以用來過濾測試執行。@ExtendWith:用來注冊自定義擴展,例如可以用來集成 Spring TestContext Framework。@Disabled:禁用某個測試方法或類。VDZ28資訊網——每日最新資訊28at.com

JUnit 5 斷言和假設:Assertions 類提供了一系列的靜態方法來聲明斷言,如 assertEquals, assertTrue, assertAll 等。Assumptions 類提供了靜態方法來聲明測試的前提條件,如 assumeTrue。Mockito 的主要特性和注解:@Mock:創建一個模擬對象。@InjectMocks:自動注入模擬對象到被測試的類中。@Spy:創建一個真實對象的包裝,可以模擬某些方法的行為。@Captor:創建一個參數捕獲器,用于捕獲方法調用的參數。VDZ28資訊網——每日最新資訊28at.com

@TestMethodOrder 是一個類型級別的注解,用于指定測試類中測試方法的執行順序。它需要與 MethodOrderer 接口的實現類一起使用,JUnit 提供了幾種不同的方法排序器,如按名稱、注解、隨機等。VDZ28資訊網——每日最新資訊28at.com

@Order 是一個方法級別的注解,用于指定測試方法的執行順序。當測試類上使用了 @TestMethodOrder(OrderAnnotation.class) 注解時,你可以在每個測試方法上使用 @Order 來定義它們的執行順序。VDZ28資訊網——每日最新資訊28at.com

以下是一些常用的 MethodOrderer 實現:VDZ28資訊網——每日最新資訊28at.com

OrderAnnotation:根據測試方法上的 @Order 注解來指定執行順序。測試方法通過 @Order 注解的值(一個整數)來定義它們的執行順序。Alphanumeric:按照測試方法名稱的字母數字順序執行。這個順序首先考慮數字,然后是字母。MethodName:按照方法名稱的字典順序(即字符串順序)執行。Random:每次執行時都按照隨機順序執行測試方法。這有助于發現由于測試方法間的依賴關系而產生的潛在問題。DisplayName:按照測試方法的顯示名稱(@DisplayName 注解指定的值)的字典順序執行。VDZ28資訊網——每日最新資訊28at.com

代碼示例:

在今天的代碼示例中,我們將在昨天的基礎上進一步完善UserController的單元測試,使用JUnit和Mockito來驗證控制器層的方法是否按照預期執行。VDZ28資訊網——每日最新資訊28at.com

在 pom.xml 文件增加增加測試依賴VDZ28資訊網——每日最新資訊28at.com

<dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-test</artifactId>      <version>3.1.6</version>      <!-- 排除 JUnit 4 -->      <exclusions>          <exclusion>              <groupId>org.junit.vintage</groupId>              <artifactId>junit-vintage-engine</artifactId>          </exclusion>      </exclusions>  </dependency>  <dependency>      <groupId>org.hamcrest</groupId>      <artifactId>hamcrest</artifactId>      <version>2.2</version>  </dependency>

UserControllerTest.javaVDZ28資訊網——每日最新資訊28at.com

package com.icoderoad.springboot60days.day9.controller;import static org.hamcrest.Matchers.hasSize;import static org.hamcrest.Matchers.is;import static org.mockito.Mockito.*;import static org.mockito.ArgumentMatchers.any;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;import com.fasterxml.jackson.databind.ObjectMapper;import com.icoderoad.springboot60days.day9.entity.User;import com.icoderoad.springboot60days.day9.service.UserService;import org.junit.jupiter.api.*;import org.junit.jupiter.api.extension.ExtendWith;import org.mockito.InjectMocks;import org.mockito.Mock;import org.mockito.junit.jupiter.MockitoExtension;import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;import org.springframework.http.MediaType;import org.springframework.test.web.servlet.MockMvc;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.mock.mockito.MockBean;import java.util.Arrays;import java.util.List;@ExtendWith(MockitoExtension.class)@WebMvcTest(UserController.class)@TestMethodOrder(MethodOrderer.OrderAnnotation.class)public class UserControllerTest {    @Autowired    private MockMvc mockMvc;    @MockBean    private UserService userService;    @Autowired    private ObjectMapper objectMapper;    private User user;    @BeforeEach    void setUp() {        user = new User();        user.setId(1L);        user.setUsername("Test User");        user.setEmail("test@example.com");    }   /**     * 驗證UserController的getAllUsers方法正常獲取所有用戶信息。     */    @Test    @Order(4)    public void getAllUsersTest() throws Exception {        List<User> users = Arrays.asList(user);        when(userService.list()).thenReturn(users);        mockMvc.perform(get("/users"))                .andExpect(status().isOk())                .andExpect(jsonPath("$", hasSize(1)))                .andExpect(jsonPath("$[0].username", is(user.getUsername())));    }   /**     * 驗證UserController的createUser方法正常創建用戶。     */    @Test    @Order(1)    public void createUserTest() throws Exception {        when(userService.saveOrUpdate(any(User.class))).thenReturn(true);;        mockMvc.perform(post("/users")                        .contentType(MediaType.APPLICATION_JSON)                        .content(objectMapper.writeValueAsString(user)))                .andExpect(status().isOk());        verify(userService, times(1)).save(any(User.class));    }   /**     * 驗證UserController的getUserById方法正常獲取指定ID的用戶信息。     */    @Test    @Order(2)    public void getUserByIdTest() throws Exception {        when(userService.getById(user.getId())).thenReturn(user);        mockMvc.perform(get("/users/{id}", user.getId()))                .andExpect(status().isOk())                .andExpect(jsonPath("$.username", is(user.getUsername())));    }          /**     * 驗證UserController的updateUserById方法正常更新指定ID的用戶信息。     */    @Test    @Order(3)    public void updateUserByIdTest() throws Exception {      when(userService.saveOrUpdate(any(User.class))).thenReturn(true);;        mockMvc.perform(put("/users/{id}", user.getId())                        .contentType(MediaType.APPLICATION_JSON)                        .content(objectMapper.writeValueAsString(user)))                .andExpect(status().isOk());        verify(userService, times(1)).updateById(any(User.class));    }          /**     * 驗證UserController的deleteUserById方法正常刪除指定ID的用戶。     */    @Test    @Order(5)    public void deleteUserByIdTest() throws Exception {      when(userService.removeById(user.getId())).thenReturn(true);;        mockMvc.perform(delete("/users/{id}", user.getId()))                .andExpect(status().isOk());        verify(userService, times(1)).removeById(user.getId());    }}

當天學習知識總結:

在今天的學習中,我們深入研究了單元測試,并利用 Mockito 框架加強了測試的功能。通過學習如何編寫JUnit5測試以及使用Mockito模擬依賴,我們揭開了單元測試的神秘面紗,為更健壯的代碼打下了堅實的基礎。VDZ28資訊網——每日最新資訊28at.com

在代碼示例中,我們創建了一個 UserControllerTest 類,使用了 Mockito 注解和特性。主要注解包括 @Mock 用于創建模擬對象,@InjectMocks 用于創建被測試類的實例并自動注入模擬對象,@Spy 用于創建 Spy 對象,@Captor 用于捕獲方法參數,以及 @RunWith(MockitoJUnitRunner.class) 用于在 JUnit 測試中運行 Mockito 測試。VDZ28資訊網——每日最新資訊28at.com

通過這些注解和特性,我們能夠編寫清晰、高效的單元測試,驗證控制器層的各個方法的行為是否符合預期。其中,我們測試了獲取所有用戶、創建用戶、獲取指定ID用戶、更新用戶、刪除用戶等方法,以確保它們在不同情況下能夠正確執行。VDZ28資訊網——每日最新資訊28at.com

總體而言,通過今天的學習,我們不僅深入了解了單元測試的基本原理,還學會了如何在Spring Boot項目中使用JUnit5和Mockito框架進行測試,為后續更復雜的業務邏輯和代碼改動提供了可靠的測試基礎。在接下來的學習中,我們將繼續VDZ28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-55350-0.html深度揭秘JUnit5與Mockito的單元測試神秘面紗

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 17個有用的CLI命令,作為前端工程師,你需要知道一下

下一篇: 17個有用的CLI命令,作為前端工程師,你需要知道一下

標簽:
  • 熱門焦點
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數據的地方,是數據源的一種,比如大家經常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數據,它既可以保
  • 谷歌KDD'23工作:如何提升推薦系統Ranking模型訓練穩定性

    谷歌在KDD 2023發表了一篇工作,探索了推薦系統ranking模型的訓練穩定性問題,分析了造成訓練穩定性存在問題的潛在原因,以及現有的一些提升模型穩定性方法的不足,并提出了一種新
  • 微信語音大揭秘:為什么禁止轉發?

    大家好,我是你們的小米。今天,我要和大家聊一個有趣的話題:為什么微信語音不可以轉發?這是一個我們經常在日常使用中遇到的問題,也是一個讓很多人好奇的問題。讓我們一起來揭開這
  • 中國家電海外掘金正當時|出海專題

    作者|吳南南編輯|胡展嘉運營|陳佳慧出品|零態LT(ID:LingTai_LT)2023年,出海市場戰況空前,中國創業者在海外紛紛摩拳擦掌,以期能夠把中國的商業模式、創業理念、戰略打法輸出海外,他們依
  • 10天營收超1億美元,《星鐵》比《原神》差在哪?

    來源:伯虎財經作者:陳平安即便你沒玩過《原神》,你一定聽說過的它的大名。恨它的人把《原神》開服那天稱作是中國游戲史上最黑暗的一天,有粉絲因為索尼在PS平臺上線《原神》,怒而
  • 品牌洞察丨服務本地,美團直播成效幾何?

    來源:17PR7月11日,美團App首頁推薦位出現&ldquo;美團直播&rdquo;的固定入口。在直播聚合頁面,外賣&ldquo;神槍手&rdquo;直播間、美團旅行直播間、美團買菜直播間等均已上線,同時
  • 造車兩年股價跌六成,小米的估值邏輯變了嗎?

    如果從小米官宣造車后的首個交易日起持有小米集團的股票,那么截至2023年上半年最后一個交易日,投資者將浮虧59.16%,同區間的恒生科技指數跌幅為52.78%
  • iQOO 11S或7月上市:搭載“雞血版”驍龍8Gen2 史上最強5G Soc

    去年底,iQOO推出了“電競旗艦”iQOO 11系列,作為一款性能強機,iQOO 11不僅全球首發2K 144Hz E6全感屏,搭載了第二代驍龍8平臺及144Hz電競屏,同時在快充
  • 2299元起!iQOO Pad開啟預售:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發布會,除了首發安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發布會上推出了旗下首款平板電腦——iQOO Pad,其搭載了天璣
Top 主站蜘蛛池模板: 和平县| 修武县| 米林县| 云浮市| 石楼县| 浦江县| 耒阳市| 东兰县| 隆子县| 泸西县| 肇庆市| 额敏县| 成武县| 萨迦县| 临夏市| 定南县| 玉田县| 新乡县| 澄江县| 元氏县| 南京市| 股票| 大洼县| 乌拉特前旗| 常德市| 华坪县| 禄丰县| 旺苍县| 钟山县| 灌云县| 孟村| 会同县| 黑河市| 桓台县| 伊春市| 烟台市| 拉孜县| 秭归县| 博野县| 水富县| 巴林左旗|