精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

三個要點,掌握Spring Boot單元測試

開發 測試
本文將從與單元測試相關的技術主題開始,在技術部分之后,介紹使用Spring Boot、JUnit和Mockito進行單元測試的實踐。

單元測試是軟件開發中不可或缺的重要環節,它用于驗證軟件中最小可測試單元的準確性。結合運用Spring Boot、JUnit、Mockito和分層架構,開發人員可以更便捷地編寫可靠、可測試且高質量的單元測試代碼,確保軟件的正確性和質量。

一、介紹

本文將從與單元測試相關的技術主題開始,在技術部分之后,介紹使用Spring Boot、JUnit和Mockito進行單元測試的實踐。

二、測試的關鍵要素

1.單元

單元測試中的單元一詞指的是軟件中可以單獨測試和處理的最小功能部分,通常是指函數、方法、類或模塊等獨立的代碼片段。

2.用例

用例描述了系統使用特定功能或特性的方式,用于理解、設計和測試軟件系統的需求。通常包括用戶如何與系統進行交互、對系統的期望以及應該實現的結果等詳細信息。

3.邊界情況

邊界情況指的是軟件必須處理的特定場景,這些場景包括意外或邊界條件,與典型情況有所不同或被認為是罕見的情況。邊界情況可以包括意外用戶登錄、測試限制、異常輸入或其他可能導致系統錯誤或異常行為的情況。在測試過程中,考慮和測試邊界情況是非常重要的,因為它們可以幫助開發人員發現潛在的問題并確保系統的魯棒性和穩定性。

三、單元測試

單元測試涵蓋了我們可以考慮并編寫的所有可能性。每個單元必須至少有一個測試方法。測試不是為一個方法編寫的,而是為一個單元編寫的。

可以按照以下順序編寫單元測試:正常路徑/用例、邊界情況和異常情況。

這些步驟是必不可少的,這樣做可以確保單元以正確的方式處理輸入,并生成預期的輸出,展現出預期的行為。單元測試是及早發現風險和修復錯誤的最佳方式。通過單元測試,我們可以預防潛在的意外情況,應對生產代碼的變更,確保生產代碼能夠處理各種情況。簡而言之,單元測試確保了生產代碼的安全性。

關于單元測試的另一個重要事項是要測試業務邏輯,不是在單元測試中測試基礎設施代碼,基礎設施代碼可以在集成測試中進行測試。可以考慮使用一些架構模式(如洋蔥架構、六邊形架構等)來將業務邏輯與基礎設施代碼分離。

單元測試的另一個優點是速度快,因為它不需要依賴 Spring ApplicationContext。由于上下文的原因,與單元測試相比,同一測試金字塔中的集成測試速度要慢得多。

1.開始編碼

在分層架構項目中,業務代碼主要位于服務層。這意味著服務層具有單元,需要進行測試。讓我們聚焦于最關鍵的部分。

以下是一段示例代碼:

  @Override
    public String saveUser(User user) {
        validateUser(user);
        try {
            User savedUser = userRepository.save(user);
            return savedUser.getEmail();
        } catch (Exception exception) {
            throw new IllegalArgumentException(E_GENERAL_SYSTEM);
        }
    }

    private void validateUser(User user) {
        if (Objects.isNull(user.getEmail())) {
            throw new IllegalArgumentException(E_USER_EMAIL_MUST_NOT_BE_NULL);
        }
        if (findByEmail(user.getEmail()).isPresent()) {
            throw new IllegalArgumentException(E_USER_ALREADY_REGISTERED);
        }
    }

    @Override
    public Optional<User> findByEmail(String email) {
        return userRepository.findByEmail(email);
    }

上述代碼中有兩個公共方法和一個私有方法,私有方法可以被視為公共方法的一部分。此外,由于代碼的復雜性和功能需求,還存在許多可能的場景需要編寫多個測試用例來覆蓋各種情況,以確保代碼的正確性。

2.注解

@ExtendWith用于將Mockito庫集成到JUnit測試中。@Test 標記一個方法,使其成為一個測試方法,測試方法包含指定的測試用例,并由 JUnit 自動運行。

在測試過程中,需要模擬正在測試的類的依賴項。之前提到的原因是,由于 Spring ApplicationContext 不會啟動,我們無法將依賴項注入到上下文中。@Mock 用于創建一個模擬的依賴項,而 @InjectMocks 則用于將這些模擬的依賴項注入到被測試類中。

@BeforeEach和@AfterEach可用于在每個方法運行之前和之后執行相應的操作。

@ParameterizedTest 用于使用不同的參數值運行重復的測試用例。通過使用 @ValueSource,可以為方法提供不同的參數值,以便進行多次測試。

3.測試方法的三個主要階段

  • Given: 準備測試用例所需的對象
  • When: 執行必要的操作以運行測試場景
  • Then: 檢查或驗證預期結果

doReturn/when 用于確定在給定指定參數時方法的行為方式。但是,由于依賴項是 @Mock,并不會真正執行。

verify 用于檢查被測試代碼是否按照預期行為執行。如果要測試的方法是 public void 類型,可以使用 verify 進行驗證。

斷言用于驗證預期結果。

 @ExtendWith(MockitoExtension.class)
class UserServiceImplTest {

    @InjectMocks
    private UserServiceImpl userService;

    @Mock
    private UserRepository userRepository;

    private User user;
    public static final String MOCK_EMAIL = "mert@bahardogan.com";

    @BeforeEach
    void setUp() {
        user = new User();
        System.out.println("init");
    }

    @AfterEach
    void teardown() {
        System.out.println("teardown");
    }

    @ParameterizedTest
    @ValueSource(strings = {"mert@bahardogan.com", "info@gmail.com"})
    @DisplayName("Happy Path: save user use cases")
    void givenCorrectUser_whenSaveUser_thenReturnUserEmail(String email) {
        // given
        user.setUserName("mertbahardogan").setEmail(email).setPassword("pass");
        User savedUser = new User().setEmail(email);
        doReturn(savedUser).when(userRepository).save(any());

        // when
        String savedUserEmail = userService.saveUser(user);

        // then
        verify(userRepository,times(1)).findByEmail(anyString());
        verify(userRepository,times(1)).save(any());
        assertEquals(email, savedUserEmail);
    }

    @Test
    @DisplayName("Exception Test: user email must not be null case")
    void givenNullUserEmail_whenSaveUser_thenThrowsEmailMustNotNullEx() {
        // when
        Exception exception = assertThrows(IllegalArgumentException.class, () -> userService.saveUser(user));

        // then
        assertNotNull(exception);
        assertEquals(E_USER_EMAIL_MUST_NOT_BE_NULL, exception.getMessage());
    }

    @Test
    @DisplayName("Exception Test: user is already registered case")
    void givenRegisteredUser_whenSaveUser_thenThrowsUserAlreadyRegisteredEx() {
        // given
        user.setEmail(MOCK_EMAIL);
        Optional<User> savedUser = Optional.of(new User().setEmail(MOCK_EMAIL));
        doReturn(savedUser).when(userRepository).findByEmail(anyString());

        // when
        Exception exception = assertThrows(IllegalArgumentException.class, () -> userService.saveUser(user));

        // then
        assertNotNull(exception);
        assertEquals(E_USER_ALREADY_REGISTERED, exception.getMessage());
    }

    @Test
    @DisplayName("Exception Test: catch case")
    void givenIncorrectDependencies_whenSaveUser_thenThrowsGeneralSystemEx() {
        // given
        user.setEmail(MOCK_EMAIL);

        // when
        Exception exception = assertThrows(IllegalArgumentException.class, () -> userService.saveUser(user));

        // then
        assertNotNull(exception);
        assertEquals(E_GENERAL_SYSTEM, exception.getMessage());
    }

    @Test
    @DisplayName("Happy Path: find user by email")
    void givenCorrectUser_whenFindByEmail_thenReturnUserEmail() {
        // given
        Optional<User> savedUser = Optional.of(new User().setEmail(MOCK_EMAIL));
        doReturn(savedUser).when(userRepository).findByEmail(anyString());

        // when
        Optional<User> user = userService.findByEmail(MOCK_EMAIL);

        // then
        verify(userRepository,times(1)).findByEmail(anyString());
        assertEquals(savedUser, user);
    }
}

UserServiceImpl測試類運行時長為1秒693毫秒。

責任編輯:趙寧寧 來源: Java學研大本營
相關推薦

2021-09-01 12:03:49

Spring單元測試

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2025-06-12 03:10:00

2021-01-07 14:06:30

Spring BootJUnit5Java

2013-06-04 09:49:04

Spring單元測試軟件測試

2017-01-14 23:42:49

單元測試框架軟件測試

2021-08-26 11:00:54

Spring BootJUnit5Java

2015-09-28 15:03:38

網絡架構測試

2024-10-16 16:09:32

2024-05-17 09:46:17

Python單元測試unittest模塊

2020-08-18 08:10:02

單元測試Java

2023-09-01 07:15:58

UnittestPython

2020-07-21 14:40:45

Spring Boot單元測試Java

2021-09-27 13:02:05

Python技巧測試

2014-02-25 10:25:52

單元測試測試

2017-03-23 16:02:10

Mock技術單元測試

2021-05-05 11:38:40

TestNGPowerMock單元測試

2021-04-23 07:33:10

SpringSecurity單元

2020-05-07 17:30:49

開發iOS技術
點贊
收藏

51CTO技術棧公眾號

青青国产91久久久久久| 天然素人一区二区视频| 成人激情av网| 国产成人精品视频在线| 国产传媒在线看| 国产亚洲高清一区| 婷婷开心激情综合| 一区二区视频在线播放| 日日夜夜精品免费| 久久中文在线| 欧美激情一区二区三区成人| 性欧美丰满熟妇xxxx性久久久| 久久草视频在线| 亚洲bt欧美bt精品777| 欧美日韩一区二区三区免费看| 美女av免费观看| av中文在线| 精品动漫3d一区二区三区免费| 日韩精品久久久久久久玫瑰园| 黄色片一级视频| 在线网址91| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 久久久国产一级片| 亚洲人免费短视频| 国产午夜久久久久| 国产精品乱码| 黄色污污视频软件| 亚洲人成免费| 欧美激情三级免费| www.5588.com毛片| 久久麻豆精品| 亚洲性生活视频在线观看| 亚洲怡红院在线| 主播大秀视频在线观看一区二区| 午夜成人在线视频| 日韩精品一区二区免费| 黄色片免费在线观看| 中文字幕不卡一区| 欧洲在线视频一区| 婷婷在线免费视频| 成人涩涩免费视频| 成人自拍网站| 亚洲av无码专区在线| 国产精品伊人色| 水蜜桃亚洲精品| 欧美国产乱视频| 国产在线综合视频| 亚洲另类春色校园小说| 亚洲精品一线二线三线| 91精产国品一二三| 欧美a在线观看| 91精品国产欧美一区二区成人| 亚洲色图 在线视频| 免费欧美电影| 在线观看精品一区| 三级a在线观看| 五月激情久久| 欧美日韩国产片| 久久久久久艹| 日韩专区第一页| 99re在线精品| 欧美一区二区三区成人久久片| 嫩草研究院在线观看| 91年精品国产| 天堂资源在线亚洲资源| av小片在线| 国产精品久久久久久久久免费相片| 亚洲激情电影在线| 久cao在线| 一区二区三区毛片| 激情深爱综合网| 亚洲一区二区三区四区| 欧美色偷偷大香| 国内av免费观看| 久久九九热re6这里有精品| 日韩成人在线免费观看| 精品人伦一区二区| 亚洲欧洲日韩| 97久久超碰福利国产精品…| 亚洲精品1区2区3区| 三级精品在线观看| 91麻豆国产精品| 天堂在线观看av| 国产精品色一区二区三区| 三年中国中文在线观看免费播放| 91在线三级| 欧美日韩一区久久| 美女伦理水蜜桃4| 国产极品一区| 欧美日韩国产精品一区二区不卡中文 | 久久九九亚洲综合| 久艹视频在线观看| 久久久久久自在自线| 亚洲999一在线观看www| 色猫av在线| 成人av在线资源网| 亚洲国产婷婷香蕉久久久久久99| 久草成色在线| 欧美日韩三级视频| 国产激情视频网站| 亚洲乱码电影| 国产v综合v亚洲欧美久久| 国产成a人亚洲精v品无码| 日日夜夜精品视频免费| 91在线高清视频| 九色在线视频蝌蚪| 亚洲综合在线免费观看| 中日韩av在线播放| 色综合久久中文| 九九九久久国产免费| 一级片在线观看免费| 国产成人在线免费观看| 亚洲精品视频一区二区三区| 9lporm自拍视频区在线| 欧美一区二区在线免费观看| 自拍偷拍视频亚洲| 在线亚洲自拍| 国产成人免费电影| www在线观看播放免费视频日本| 欧美日韩中文在线| 在线播放av网址| 国产精品久久久久久久久妇女| 欧美亚洲一级片| 成人毛片视频免费看| 一区在线观看视频| 亚洲精品久久久中文字幕| 视频小说一区二区| 97视频在线免费观看| www.久久精品.com| 亚洲人成网站精品片在线观看| 一级全黄肉体裸体全过程| 成人免费看黄| 精品香蕉一区二区三区| 国产一级片网址| 国产乱色国产精品免费视频| 亚洲综合欧美日韩| 狠狠久久伊人中文字幕| 国产亚洲精品久久久久久| wwwxxx亚洲| 99re在线视频这里只有精品| 欧美啪啪免费视频| 日本韩国欧美超级黄在线观看| 久久全球大尺度高清视频| 国产成人毛毛毛片| 一个色综合av| 欧美xxxxx精品| 亚洲高清电影| 精品国产乱码久久久久软件| а√天堂中文在线资源8| 亚洲成人在线视频播放| 免费一级特黄特色大片| 99re热这里只有精品免费视频| www.国产在线视频| 精品无人区一区二区| 538国产精品一区二区在线| 午夜福利视频一区二区| 日韩欧美a级成人黄色| 亚洲AV无码国产成人久久| 麻豆久久精品| 午夜一区二区三区| 少妇户外露出[11p]| 精品一区二区三区四| 精品999成人| 久久66热这里只有精品| 日韩免费va| 日韩中文字幕网站| av网站在线观看免费| 亚洲精品videosex极品| 日韩av无码一区二区三区不卡| 亚洲高清网站| 欧美一级爱爱| 福利一区三区| 98精品在线视频| 国产女人在线视频| 7777精品伊人久久久大香线蕉的 | 日韩伦理视频| 成人性生交大片免费看视频直播| 国产黄大片在线观看画质优化| 欧美电视剧在线看免费| 手机在线视频一区| 你懂的一区二区| 精品欧美一区二区三区久久久 | 高潮毛片无遮挡| 精品制服美女久久| 亚洲 自拍 另类小说综合图区| 伊甸园亚洲一区| 91精品国产综合久久久久久蜜臀 | 91国偷自产一区二区使用方法| 蜜桃av.com| 99精品热视频| 亚洲一二三不卡| 在线视频精品| 欧美另类videos| 日本成人福利| 超碰精品一区二区三区乱码| 少妇一区二区三区四区| 欧美日韩亚州综合| 91精品国产乱码在线观看| 国产精品久久精品日日| 欧美熟妇精品一区二区蜜桃视频| 日本成人在线不卡视频| 欧美在线一区视频| 91av精品| 午夜精品一区二区在线观看的| 国产精品17p| 成人av在线网址| 亚洲欧美小说色综合小说一区| 理论片在线不卡免费观看| 欧美色综合一区二区三区| 日韩欧美综合一区| 成年人午夜剧场| 国产日韩亚洲欧美综合| 日本人添下边视频免费| 国产一本一道久久香蕉| 欧美午夜性生活| 国产一区二区三区久久久久久久久| 一区二区91美女张开腿让人桶| 亚洲最大在线| 国产视频精品网| 色播一区二区| 欧美激情亚洲综合一区| 国产在线观看91| 中文字幕日韩av| 亚洲天堂手机版| 欧美色视频日本版| 日本一区二区不卡在线| 一区二区三区在线免费观看| 国产三级精品三级观看| 亚洲国产精品ⅴa在线观看| 大又大又粗又硬又爽少妇毛片| 不卡高清视频专区| 少妇伦子伦精品无吗| 国产精品一区二区黑丝| 亚洲免费成人在线视频| 久久精品国产精品亚洲精品| www.色偷偷.com| 日韩精品1区2区3区| 青青青在线播放| 亚洲综合精品| 成人免费观看视频在线观看| 国产视频一区免费看| 婷婷无套内射影院| 日韩视频中文| 男女高潮又爽又黄又无遮挡| 日韩视频二区| 免费大片在线观看| 日韩高清一级片| 性生活免费在线观看| 麻豆一区二区三区| 91精品999| 国产一区二区三区在线观看精品| 日韩欧美国产片| 精品一区二区三区影院在线午夜 | 日韩在线高清视频| 国内外激情在线| 欧美成人午夜免费视在线看片| 在线看三级电影| 久久久亚洲精品视频| 交100部在线观看| 人九九综合九九宗合| 欧美aaa大片视频一二区| 成人精品久久一区二区三区| 欧美大片91| 国语精品中文字幕| 激情五月综合网| 致1999电视剧免费观看策驰影院| 91精品99| 麻豆tv在线播放| 日韩高清在线电影| 欧美性受xxxx黒人xyx性爽| 国产成人日日夜夜| 野外性满足hd| 国产寡妇亲子伦一区二区| 秘密基地免费观看完整版中文| 99精品视频免费在线观看| 国产精品理论在线| 一区二区三区四区高清精品免费观看 | 香港成人在线视频| 波多野结衣人妻| 欧美v日韩v国产v| 黄色在线免费观看大全| 日韩在线视频线视频免费网站| 天天摸天天干天天操| 亚洲深夜福利视频| a级网站在线播放| 51ⅴ精品国产91久久久久久| 亚洲高清国产拍精品26u| 国产高清一区视频| 日韩精品一卡| 日本一道本久久| 九九九久久久精品| 少妇饥渴放荡91麻豆| 自拍偷拍亚洲欧美日韩| 特级做a爱片免费69| 亚洲国产乱码最新视频| 亚洲天堂黄色片| 色婷婷av一区二区三区软件| 国产熟女精品视频| 亚洲午夜未满十八勿入免费观看全集 | 成人综合视频在线| 国产成人在线视频免费播放| 99精品欧美一区二区| 亚洲国产精品人人做人人爽| 在线观看免费观看在线| 精品呦交小u女在线| 超碰在线caoporn| 国产精品黄色av| 奇米影视777在线欧美电影观看| 国产又爽又黄ai换脸| 久久久久一区| 久久久久9999| 一区二区三区不卡视频| 亚洲系列在线观看| 亚洲欧美激情一区| 高清在线视频不卡| 99久久国产免费免费| 久久婷婷蜜乳一本欲蜜臀| 国产裸体舞一区二区三区| 国产69精品久久久久777| 日本黄区免费视频观看| 日本韩国欧美一区二区三区| 天天操天天干天天操| 欧美激情乱人伦一区| 国产精品日韩精品在线播放 | 午夜在线播放视频欧美| 天堂va欧美va亚洲va老司机| 亚洲欧洲一区二区三区| 中文字幕精品无码亚| 亚洲欧洲成视频免费观看| 手机在线观看av网站| 国产丝袜不卡| 亚洲美女毛片| 亚洲欧洲国产视频| 一区二区高清免费观看影视大全| 国产精品主播一区二区| 日韩亚洲欧美中文高清在线| jizz亚洲女人高潮大叫| 视频在线99| 麻豆国产精品官网| 男女男精品视频网站| 欧美女孩性生活视频| 97国产精品久久久| 日韩午夜小视频| 高清全集视频免费在线| 91网站在线免费观看| 亚洲激情久久| 91蝌蚪视频在线| 亚洲伦理在线精品| www.成人免费视频| 久久久中精品2020中文| 国产一区在线电影| 国内自拍在线观看| 久久久久久免费网| 日韩乱码一区二区三区| 中文字幕精品久久| 国产精品毛片无码| 日韩一级性生活片| 91亚洲精品久久久蜜桃网站| 日本熟女毛茸茸| 一区二区亚洲精品国产| 亚洲视频自拍| 欧美交换配乱吟粗大25p| 9l国产精品久久久久麻豆| 日日骚av一区二区| 色综久久综合桃花网| 亚洲一区二区电影| 人妻久久久一区二区三区| 久久久.com| 一级日韩一级欧美| 欧美夫妻性视频| 五月综合久久| 国产成人美女视频| 亚洲国产精品久久久男人的天堂| 午夜成人免费影院| 国产中文字幕亚洲| 最新亚洲一区| www久久久久久久| 欧美一区二区人人喊爽| 麻豆视频在线观看免费网站黄| 日韩一本精品| 粉嫩一区二区三区在线看| 亚洲久久在线观看| 久久人人爽亚洲精品天堂| 国产精品男女| 亚洲欧美偷拍另类| 亚瑟在线精品视频| 免费观看在线黄色网| 国产在线观看一区| 另类的小说在线视频另类成人小视频在线| 欧美另类视频在线观看| 亚洲性日韩精品一区二区| 综合激情五月婷婷| 第四色婷婷基地| 欧美日韩亚洲成人| 1769免费视频在线观看| 日韩久久久久久久| 成人免费看视频| 国产精品怡红院| 国产福利精品在线| 亚洲每日在线|