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

當(dāng)前位置:首頁(yè) > 科技  > 軟件

三個(gè)要點(diǎn),掌握Spring Boot單元測(cè)試

來(lái)源: 責(zé)編: 時(shí)間:2023-09-28 10:06:01 377觀看
導(dǎo)讀單元測(cè)試是軟件開發(fā)中不可或缺的重要環(huán)節(jié),它用于驗(yàn)證軟件中最小可測(cè)試單元的準(zhǔn)確性。結(jié)合運(yùn)用Spring Boot、JUnit、Mockito和分層架構(gòu),開發(fā)人員可以更便捷地編寫可靠、可測(cè)試且高質(zhì)量的單元測(cè)試代碼,確保軟件的正確性和

單元測(cè)試是軟件開發(fā)中不可或缺的重要環(huán)節(jié),它用于驗(yàn)證軟件中最小可測(cè)試單元的準(zhǔn)確性。結(jié)合運(yùn)用Spring Boot、JUnit、Mockito和分層架構(gòu),開發(fā)人員可以更便捷地編寫可靠、可測(cè)試且高質(zhì)量的單元測(cè)試代碼,確保軟件的正確性和質(zhì)量。5ck28資訊網(wǎng)——每日最新資訊28at.com

5ck28資訊網(wǎng)——每日最新資訊28at.com

一、介紹

本文將從與單元測(cè)試相關(guān)的技術(shù)主題開始,在技術(shù)部分之后,介紹使用Spring Boot、JUnit和Mockito進(jìn)行單元測(cè)試的實(shí)踐。5ck28資訊網(wǎng)——每日最新資訊28at.com

二、測(cè)試的關(guān)鍵要素

1.單元

單元測(cè)試中的單元一詞指的是軟件中可以單獨(dú)測(cè)試和處理的最小功能部分,通常是指函數(shù)、方法、類或模塊等獨(dú)立的代碼片段。5ck28資訊網(wǎng)——每日最新資訊28at.com

2.用例

用例描述了系統(tǒng)使用特定功能或特性的方式,用于理解、設(shè)計(jì)和測(cè)試軟件系統(tǒng)的需求。通常包括用戶如何與系統(tǒng)進(jìn)行交互、對(duì)系統(tǒng)的期望以及應(yīng)該實(shí)現(xiàn)的結(jié)果等詳細(xì)信息。5ck28資訊網(wǎng)——每日最新資訊28at.com

3.邊界情況

邊界情況指的是軟件必須處理的特定場(chǎng)景,這些場(chǎng)景包括意外或邊界條件,與典型情況有所不同或被認(rèn)為是罕見(jiàn)的情況。邊界情況可以包括意外用戶登錄、測(cè)試限制、異常輸入或其他可能導(dǎo)致系統(tǒng)錯(cuò)誤或異常行為的情況。在測(cè)試過(guò)程中,考慮和測(cè)試邊界情況是非常重要的,因?yàn)樗鼈兛梢詭椭_發(fā)人員發(fā)現(xiàn)潛在的問(wèn)題并確保系統(tǒng)的魯棒性和穩(wěn)定性。5ck28資訊網(wǎng)——每日最新資訊28at.com

三、單元測(cè)試

單元測(cè)試涵蓋了我們可以考慮并編寫的所有可能性。每個(gè)單元必須至少有一個(gè)測(cè)試方法。測(cè)試不是為一個(gè)方法編寫的,而是為一個(gè)單元編寫的。5ck28資訊網(wǎng)——每日最新資訊28at.com

可以按照以下順序編寫單元測(cè)試:正常路徑/用例、邊界情況和異常情況。5ck28資訊網(wǎng)——每日最新資訊28at.com

這些步驟是必不可少的,這樣做可以確保單元以正確的方式處理輸入,并生成預(yù)期的輸出,展現(xiàn)出預(yù)期的行為。單元測(cè)試是及早發(fā)現(xiàn)風(fēng)險(xiǎn)和修復(fù)錯(cuò)誤的最佳方式。通過(guò)單元測(cè)試,我們可以預(yù)防潛在的意外情況,應(yīng)對(duì)生產(chǎn)代碼的變更,確保生產(chǎn)代碼能夠處理各種情況。簡(jiǎn)而言之,單元測(cè)試確保了生產(chǎn)代碼的安全性。5ck28資訊網(wǎng)——每日最新資訊28at.com

關(guān)于單元測(cè)試的另一個(gè)重要事項(xiàng)是要測(cè)試業(yè)務(wù)邏輯,不是在單元測(cè)試中測(cè)試基礎(chǔ)設(shè)施代碼,基礎(chǔ)設(shè)施代碼可以在集成測(cè)試中進(jìn)行測(cè)試。可以考慮使用一些架構(gòu)模式(如洋蔥架構(gòu)、六邊形架構(gòu)等)來(lái)將業(yè)務(wù)邏輯與基礎(chǔ)設(shè)施代碼分離。5ck28資訊網(wǎng)——每日最新資訊28at.com

單元測(cè)試的另一個(gè)優(yōu)點(diǎn)是速度快,因?yàn)樗恍枰蕾?Spring ApplicationContext。由于上下文的原因,與單元測(cè)試相比,同一測(cè)試金字塔中的集成測(cè)試速度要慢得多。5ck28資訊網(wǎng)——每日最新資訊28at.com

1.開始編碼

在分層架構(gòu)項(xiàng)目中,業(yè)務(wù)代碼主要位于服務(wù)層。這意味著服務(wù)層具有單元,需要進(jìn)行測(cè)試。讓我們聚焦于最關(guān)鍵的部分。5ck28資訊網(wǎng)——每日最新資訊28at.com

以下是一段示例代碼:5ck28資訊網(wǎng)——每日最新資訊28at.com

  @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);    }

上述代碼中有兩個(gè)公共方法和一個(gè)私有方法,私有方法可以被視為公共方法的一部分。此外,由于代碼的復(fù)雜性和功能需求,還存在許多可能的場(chǎng)景需要編寫多個(gè)測(cè)試用例來(lái)覆蓋各種情況,以確保代碼的正確性。5ck28資訊網(wǎng)——每日最新資訊28at.com

2.注解

@ExtendWith用于將Mockito庫(kù)集成到JUnit測(cè)試中。@Test 標(biāo)記一個(gè)方法,使其成為一個(gè)測(cè)試方法,測(cè)試方法包含指定的測(cè)試用例,并由 JUnit 自動(dòng)運(yùn)行。5ck28資訊網(wǎng)——每日最新資訊28at.com

在測(cè)試過(guò)程中,需要模擬正在測(cè)試的類的依賴項(xiàng)。之前提到的原因是,由于 Spring ApplicationContext 不會(huì)啟動(dòng),我們無(wú)法將依賴項(xiàng)注入到上下文中。@Mock 用于創(chuàng)建一個(gè)模擬的依賴項(xiàng),而 @InjectMocks 則用于將這些模擬的依賴項(xiàng)注入到被測(cè)試類中。5ck28資訊網(wǎng)——每日最新資訊28at.com

@BeforeEach和@AfterEach可用于在每個(gè)方法運(yùn)行之前和之后執(zhí)行相應(yīng)的操作。5ck28資訊網(wǎng)——每日最新資訊28at.com

@ParameterizedTest 用于使用不同的參數(shù)值運(yùn)行重復(fù)的測(cè)試用例。通過(guò)使用 @ValueSource,可以為方法提供不同的參數(shù)值,以便進(jìn)行多次測(cè)試。5ck28資訊網(wǎng)——每日最新資訊28at.com

3.測(cè)試方法的三個(gè)主要階段

  • Given: 準(zhǔn)備測(cè)試用例所需的對(duì)象
  • When: 執(zhí)行必要的操作以運(yùn)行測(cè)試場(chǎng)景
  • Then: 檢查或驗(yàn)證預(yù)期結(jié)果

doReturn/when 用于確定在給定指定參數(shù)時(shí)方法的行為方式。但是,由于依賴項(xiàng)是 @Mock,并不會(huì)真正執(zhí)行。5ck28資訊網(wǎng)——每日最新資訊28at.com

verify 用于檢查被測(cè)試代碼是否按照預(yù)期行為執(zhí)行。如果要測(cè)試的方法是 public void 類型,可以使用 verify 進(jìn)行驗(yàn)證。5ck28資訊網(wǎng)——每日最新資訊28at.com

斷言用于驗(yàn)證預(yù)期結(jié)果。5ck28資訊網(wǎng)——每日最新資訊28at.com

 @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測(cè)試類運(yùn)行時(shí)長(zhǎng)為1秒693毫秒。5ck28資訊網(wǎng)——每日最新資訊28at.com

5ck28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-11820-0.html三個(gè)要點(diǎn),掌握Spring Boot單元測(cè)試

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: DevOps優(yōu)秀實(shí)踐之用戶與權(quán)限

下一篇: C 語(yǔ)言程序是如何在計(jì)算機(jī)內(nèi)部工作?

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 直屏旗艦來(lái)了 iQOO 12和K70 Pro同臺(tái)競(jìng)技

    旗艦機(jī)基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛(ài)好者在苦等一款直屏旗艦,這次,你們等到了。據(jù)博主數(shù)碼閑聊站帶來(lái)的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 摸魚心法第一章——和配置文件說(shuō)拜拜

    為了能摸魚我們團(tuán)隊(duì)做了容器化,但是帶來(lái)的問(wèn)題是服務(wù)配置文件很麻煩,然后大家在群里進(jìn)行了“親切友好”的溝通圖片圖片圖片圖片對(duì)比就對(duì)比,簡(jiǎn)單對(duì)比下獨(dú)立配置中心和k8s作為配
  • 把LangChain跑起來(lái)的三個(gè)方法

    使用LangChain開發(fā)LLM應(yīng)用時(shí),需要機(jī)器進(jìn)行GLM部署,好多同學(xué)第一步就被勸退了,那么如何繞過(guò)這個(gè)步驟先學(xué)習(xí)LLM模型的應(yīng)用,對(duì)Langchain進(jìn)行快速上手?本片講解3個(gè)把LangChain跑起來(lái)
  • 一年經(jīng)驗(yàn)在二線城市面試后端的經(jīng)驗(yàn)分享

    忠告這篇文章只適合2年內(nèi)工作經(jīng)驗(yàn)、甚至沒(méi)有工作經(jīng)驗(yàn)的朋友閱讀。如果你是2年以上工作經(jīng)驗(yàn),請(qǐng)果斷劃走,對(duì)你沒(méi)啥幫助~主人公這篇文章內(nèi)容來(lái)自 「升職加薪」星球星友 的投稿,坐
  • 品牌洞察丨服務(wù)本地,美團(tuán)直播成效幾何?

    來(lái)源:17PR7月11日,美團(tuán)App首頁(yè)推薦位出現(xiàn)&ldquo;美團(tuán)直播&rdquo;的固定入口。在直播聚合頁(yè)面,外賣&ldquo;神槍手&rdquo;直播間、美團(tuán)旅行直播間、美團(tuán)買菜直播間等均已上線,同時(shí)
  • 華為HarmonyOS 4.0將于8月4日發(fā)布 或搭載AI大模型技術(shù)

    華為宣布HarmonyOS4.0將于8月4日正式發(fā)布。此前,華為已經(jīng)針對(duì)開發(fā)者公布了HarmonyOS4.0,以便于開發(fā)者提前進(jìn)行適配,也因此被曝光出了一些新系統(tǒng)的特性
  • 聯(lián)想小新Pad Pro 12.6將要推出,搭載高通驍龍 870 處理器

    聯(lián)想小新Pad Pro 12.6將于秋季新品會(huì)上推出,官方按照慣例直接在發(fā)布會(huì)前給出了機(jī)型的所有參數(shù)。聯(lián)想小新 Pad Pro 12.6 將搭載高通驍龍 870 處理器,重量為 5
  • 英特爾Xe HPG游戲顯卡:擁有512EU,單風(fēng)扇版本

    據(jù)10 月 30 日外媒 TheVerge 消息報(bào)道,英特爾 Xe HPG Arc Alchemist 的正面實(shí)被曝光,不僅擁有 512 EU 版顯卡,還擁有 128EU 的單風(fēng)扇版本。另外,這款顯卡 PCB
  • Meta盲目擴(kuò)張致超萬(wàn)人被裁,重金押注元宇宙而前景未明

    圖片來(lái)源:圖蟲創(chuàng)意日前,Meta創(chuàng)始人兼CEO 馬克&middot;扎克伯發(fā)布公開信,宣布Meta計(jì)劃裁員超11000人,占其員工總數(shù)13%。他公開承認(rèn)了自己的預(yù)判失誤:&ldquo;不僅
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
日韩午夜激情| 在线观看91精品国产入口| 欧美人交a欧美精品| 欧美另类69精品久久久久9999| 欧美精品一区二区视频 | 日韩视频免费观看| 99re6热在线精品视频播放速度| 亚洲色图在线视频| 欧美一级播放| 女女同性精品视频| 国产精品久久91| 永久免费精品影视网站| 一区二区欧美激情| 久久精品一级爱片| 欧美日韩高清在线观看| 国产午夜久久久久| 亚洲精品在线二区| 欧美淫片网站| 欧美精品日韩综合在线| 国产欧美精品一区二区色综合 | 亚洲欧美日韩国产综合| 两个人的视频www国产精品| 欧美午夜在线| 在线国产精品播放| 亚洲一区在线播放| 免费人成网站在线观看欧美高清| 国产精品高潮视频| 在线观看福利一区| 亚洲在线电影| 欧美精品大片| 黑人极品videos精品欧美裸| 国产精品99久久久久久www| 免费观看久久久4p| 国产欧美 在线欧美| 日韩系列欧美系列| 久久亚洲国产成人| 国产精品亚洲精品| 日韩视频不卡| 久久欧美肥婆一二区| 国产精品国产三级国产aⅴ入口| 在线不卡免费欧美| 欧美亚洲日本网站| 欧美视频三区在线播放| 亚洲高清网站| 久久久精品免费视频| 国产精品男人爽免费视频1| 亚洲欧洲精品一区二区| 欧美中文字幕第一页| 欧美日韩综合精品| 亚洲品质自拍| 老司机一区二区三区| 国产自产精品| 午夜在线视频观看日韩17c| 欧美日韩国内| 亚洲区一区二| 美日韩在线观看| 韩国av一区二区三区四区| 欧美一区二区免费视频| 国产精品久久久久一区二区三区| 亚洲美女区一区| 欧美国产日韩精品免费观看| 悠悠资源网亚洲青| 久久久国产91| 国产综合香蕉五月婷在线| 欧美一激情一区二区三区| 国产精品综合av一区二区国产馆| 亚洲视频精品| 欧美午夜视频| 亚洲视频在线观看网站| 欧美日韩国产精品自在自线| 亚洲日韩欧美视频| 欧美成人日韩| 亚洲人成人一区二区三区| 免费的成人av| 亚洲国产精品久久久久| 久久久国产精品一区二区三区| 国产欧美日韩一区二区三区在线观看 | 久久精品亚洲热| 国产一区二区激情| 欧美影院在线| 国产一区清纯| 久久久久久一区| 怡红院av一区二区三区| 久久综合给合| 在线成人黄色| 久久一区二区三区国产精品| 伊人久久综合97精品| 老色鬼精品视频在线观看播放| 一色屋精品视频免费看| 美女尤物久久精品| 亚洲欧洲在线视频| 欧美日韩国产首页| 亚洲午夜免费福利视频| 欧美午夜美女看片| 午夜精品久久久久久久99水蜜桃| 国产欧美欧美| 久久久久这里只有精品| 亚洲高清免费在线| 欧美黄色一区| 在线性视频日韩欧美| 国产精品久久久久久久一区探花 | 最新成人av网站| 欧美三级欧美一级| 午夜在线观看欧美| 亚洲成人在线网| 欧美精品久久久久久久免费观看| 日韩一区二区高清| 国产精品久久一卡二卡| 久久er精品视频| 尤物yw午夜国产精品视频明星| 欧美成人精品三级在线观看| 日韩一级黄色大片| 国产日韩在线视频| 你懂的一区二区| 在线视频欧美一区| 国产亚洲综合精品| 欧美成人精品影院| 亚洲桃花岛网站| 国产一区二区看久久| 欧美二区乱c少妇| 亚洲自拍电影| 尤物在线精品| 欧美日韩精品福利| 欧美在线亚洲在线| 最新亚洲电影| 国产精品夜夜夜| 欧美1区免费| 亚洲欧美日韩综合| 亚洲高清免费| 国产精品有限公司| 欧美大片免费| 午夜免费日韩视频| 最新亚洲一区| 国产欧美综合在线| 欧美高清在线一区| 午夜精品在线观看| 亚洲国产精品ⅴa在线观看| 欧美午夜精品久久久久久人妖| 久久精品国产第一区二区三区最新章节| 亚洲日本成人在线观看| 国产美女精品| 欧美精品www在线观看| 欧美一区二区女人| 日韩视频在线观看免费| 国产一区日韩二区欧美三区| 欧美日本中文字幕| 久久久精品视频成人| 亚洲深夜福利在线| 亚洲国产高清自拍| 国产视频不卡| 欧美午夜a级限制福利片| 久久亚洲精品欧美| 亚洲欧美欧美一区二区三区| 欧美在线免费视屏| 亚洲免费福利视频| 伊人男人综合视频网| 国产精品日产欧美久久久久| 欧美激情欧美狂野欧美精品| 欧美在线啊v一区| 一区二区三区av| 亚洲国产高清自拍| 韩国v欧美v日本v亚洲v| 国产精品久久久久av| 欧美高清在线播放| 久久久久久久久伊人| 亚洲欧美日韩综合aⅴ视频| 99成人精品| 91久久精品国产91性色| 极品少妇一区二区| 国产三级精品三级| 国产精品久久久久久久久婷婷| 欧美高清影院| 久色婷婷小香蕉久久| 久久成人av少妇免费| 亚洲免费视频成人| 一本久道综合久久精品| 亚洲娇小video精品| 在线观看一区二区精品视频| 国产午夜久久| 国产美女精品免费电影| 国产精品v一区二区三区| 欧美—级在线免费片| 嫩草伊人久久精品少妇av杨幂| 久久精品国产免费观看| 性色一区二区三区| 亚洲欧美高清| 亚洲在线视频观看| 亚洲一区二区毛片| 在线亚洲欧美| 一区二区三区久久网| 亚洲欧洲视频| 亚洲啪啪91| 亚洲国产精品久久| 亚洲欧洲日本一区二区三区| 亚洲福利精品| 亚洲第一精品夜夜躁人人躁| 在线观看成人一级片| 尹人成人综合网| 亚洲国产高清在线观看视频| 亚洲国产成人av好男人在线观看| 伊人久久综合97精品| 在线观看日韩专区| 亚洲黄色尤物视频| 亚洲精品视频在线观看网站|