<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Java 單元測試簡單掃盲

      前言

      仔細回想起來,上次認真編寫單元測試已經是兩年前的事了。那時候覺得寫單元測試是種負擔。

      為了應付代碼覆蓋率要求,常常依賴工具自動生成測試用例,有時需要啟動Spring容器,有時又不需要(當時還分不清單元測試和集成測試的區別)。

      直到最近在開發過程中,當需要重構代碼或自測功能時,我才真正體會到單元測試的價值。

      概念

      單元測試的本質是通過獨立的測試用例來驗證代碼單元(方法/函數)的邏輯正確性。

      在日常開發中,我們經常會在類里隨手寫一個 main 方法來快速驗證邏輯,比如:

      public static void main(String[] args) {
          int expectResult = 9;
          int result = 3 * 3;
          if (result == expectResult) {
              System.out.println("測試成功");
          } else {
              System.out.println("測試失敗");
          }
      }
      

      測試分類

      首先介紹一下,單元測試與集成測試的區別,剛開始學習的時候,沒有分清它倆的區別,導致一直感覺單元測試是一個很復雜的東西。

      集成測試

      需要啟動完整的 Spring 容器,容器內所有的 Bean 可以正常注入使用。通俗一點,相當于寫了一個 TestController。

      @SpringBootTest  // 啟動完整Spring容器
      class UserControllerIntegrationTest {
          @Autowired  // 真實注入Bean
          private UserController userController;
      
          @Test
          void testGetUser() {
              User user = userController.getUser(1L);
              assertNotNull(user);
          }
      }
      

      單元測試

      不啟動 Spring 容器,所有依賴需要手動模擬

      @ExtendWith(MockitoExtension.class)  // 啟用Mockito注解支持
      class UserServiceUnitTest {
      
          @Mock
          private UserRepository userRepository;
      
          @InjectMocks
          private UserService userService;
      
          @Test
          void testGetUser() {
              when(userRepository.findById(1L))
                     .thenReturn(new User(1L, "Mock用戶"));
      
              User user = userService.getUser(1L);
      
              assertEquals("Mock用戶", user.getName());
          }
      }
      
      維度 單元測試 集成測試
      目標 驗證單個代碼單元(如方法、類)的功能正確性 驗證多個模塊、組件或外部系統協同工作的正確性
      范圍 隔離測試,不依賴外部系統(如數據庫、網絡、其他服務) 依賴外部系統或跨組件的交互(如數據庫連接、API 調用)
      覆蓋范圍 聚焦分支,驗證代碼片段邏輯正確性 聚焦模塊間交互,驗證系統整體行為

      核心注解介紹

      @Resource (Spring標準注解)

      作用:用于依賴注入,會按照名稱或類型從Spring容器中獲取真實的bean
      測試場景:集成測試中需要完全使用真實邏輯時

      @MockBean (Spring Boot測試注解)

      作用:向Spring應用上下文注入一個mock對象,替代原有的bean
      測試場景:Spring Boot集成測試中需要mock某些bean時

      @Spy (Mockito注解)

      作用:創建部分mock對象,未mock的方法使用真實邏輯,mock的方法使用自定義邏輯
      測試場景:需要保留對象大部分真實行為,僅修改少數方法邏輯的測試

      @Mock (Mockito注解)

      作用:創建完整mock對象,所有方法都需要mock,未mock的方法會返回默認值或空集合
      測試場景:需要完全模擬依賴行為的單元測試

      @InjectMocks (Mockito注解)

      作用:自動將@Mock或@Spy創建的mock對象注入到被測試對象中
      測試場景:需要自動裝配依賴的單元測試

      使用

      依賴文件

      添加依賴,具體版本需要根據項目版本自己替換

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

      單元測試

      @Spy@Mock 的區別:

      @Mock 所有方法都需要 mock,未 mock 的方法會返回默認值或空集合 ; @Spy 未 mock 的方法使用真實邏輯,mock 的方法使用自定義邏輯

      注意:沒有無參構造會初始化為空指針,需要手動實例化進行解決

      @Spy
      private UserService userService = new UserService(); // 顯式提供實例
      

      集成測試

      @MockBean:向Spring上下文注入 Mock對象

      @SpringBootTest
      public class UserServiceTest {
          @Autowired
          private UserService userService; // 注入真實 UserService
      
          @MockBean
          private UserRepository userRepository; // 替換 Spring 容器中的 UserRepository
      
          @Test
          public void testGetUser() {
              User mockUser = new User(1, "Alice");
              when(userRepository.findById(1)).thenReturn(Optional.of(mockUser));
      
              User result = userService.getUser(1);
      
              assertEquals("Alice", result.getName());
              verify(userRepository).findById(1);
          }
      }
      

      總結

      更多的內容還需要在探索后補充

      posted @ 2025-04-19 12:11  帥氣的濤啊  閱讀(74)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 妓女妓女一区二区三区在线观看| 蜜臀av日韩精品一区二区| 无码日韩av一区二区三区| 国产精品入口中文字幕| 国产精品日韩深夜福利久久| 中文字幕日韩有码一区| 国产激情艳情在线看视频| 噜噜噜噜私人影院| 国产精品中文字幕自拍| 任我爽精品视频在线播放| 伦伦影院精品一区| 国产91丝袜在线播放动漫| xbox免费观看高清视频的软件| 亚洲国产高清aⅴ视频| 亚洲精品自拍区在线观看 | 久久精品国产亚洲av高| 亚洲最大有声小说AV网| 久久久久无码精品国产h动漫| 中文字幕日本六区小电影| 午夜精品国产自在| 亚洲一区二区三区在线播放无码 | 少妇厨房愉情理9仑片视频| 综合在线 亚洲 成人 欧美| 玩弄放荡人妻少妇系列| 亚洲欧洲一区二区精品| 九九热精品在线观看| 免费观看日本污污ww网站69| 一区二区三区人妻无码| 蜜臀91精品高清国产福利| 亚洲第一极品精品无码久久| 2020年最新国产精品正在播放| 国精偷拍一区二区三区| 欧洲亚洲精品免费二区| 五月国产综合视频在线观看| 国产亚洲tv在线观看| 少妇人妻无码专区在线视频| 日韩av在线一卡二卡三卡| 亚洲欧美综合人成在线 | 免费全部高h视频无码| 91精品国产麻豆国产自产| 国产精品成人久久电影|