最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java void方法單測(cè)斷言的三種實(shí)現(xiàn)示例

 更新時(shí)間:2025年07月09日 10:45:28   作者:悟能不能悟  
Java中對(duì)void方法單元測(cè)試可通過驗(yàn)證狀態(tài)變化、行為交互及異常拋出實(shí)現(xiàn),推薦使用AssertJ和Mockito,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在 Java 中對(duì) void 方法進(jìn)行單元測(cè)試斷言,主要通過以下三種策略實(shí)現(xiàn)(以 JUnit 和 AssertJ 為例):

1. 驗(yàn)證狀態(tài)變化(最常用)

測(cè)試方法執(zhí)行后對(duì)象或系統(tǒng)狀態(tài)的改變:

@Test
void reset_shouldClearCounter() {
    Counter counter = new Counter();
    counter.increment(); // 初始值+1
    
    // 執(zhí)行 void 方法
    counter.reset();
    
    // 驗(yàn)證內(nèi)部狀態(tài)
    assertEquals(0, counter.getCount());
    
    // 使用 AssertJ 更優(yōu)雅的斷言
    assertThat(counter.getCount()).isZero();
}

2. 驗(yàn)證行為交互(使用 Mockito)

當(dāng) void 方法依賴其他對(duì)象時(shí),驗(yàn)證是否正確調(diào)用協(xié)作對(duì)象:

@Test
void notifyUser_shouldTriggerNotificationService() {
    // 創(chuàng)建依賴項(xiàng)的 mock
    NotificationService mockService = mock(NotificationService.class);
    UserService userService = new UserService(mockService);
    
    // 執(zhí)行 void 方法
    userService.notifyUser("user123");
    
    // 驗(yàn)證是否調(diào)用了依賴對(duì)象的特定方法
    verify(mockService).sendNotification(eq("user123"));
    
    // 驗(yàn)證調(diào)用次數(shù)
    verify(mockService, times(1)).sendNotification(any());
}

3. 驗(yàn)證異常拋出

測(cè)試方法在非法輸入時(shí)的異常行為:

@Test
void withdraw_shouldThrowExceptionWhenOverdraft() {
    Account account = new Account(100);
    
    // 驗(yàn)證異常斷言 (JUnit 5)
    assertThrows(InsufficientFundsException.class, () -> {
        account.withdraw(200); // void 方法
    });
    
    // AssertJ 異常斷言
    assertThatThrownBy(() -> account.withdraw(200))
        .isInstanceOf(InsufficientFundsException.class)
        .hasMessage("余額不足");
}

最佳實(shí)踐建議:

?狀態(tài)優(yōu)先原則?:優(yōu)先驗(yàn)證對(duì)象狀態(tài)變化而非內(nèi)部行為

?行為驗(yàn)證場(chǎng)景?:

  • 當(dāng)調(diào)用外部系統(tǒng)接口(如發(fā)送郵件)
  • 需要確認(rèn)調(diào)用順序或次數(shù)(如多次調(diào)用)

?自定義驗(yàn)證器?:復(fù)雜狀態(tài)可封裝驗(yàn)證邏輯

@Test
void updateProfile_shouldChangeMultipleFields() {
    User user = new User();
    user.updateProfile("Alice", 30, "alice@email.com");
    
    // 自定義斷言方法
    assertUserProfile(user, "Alice", 30, "alice@email.com");
}
 
private void assertUserProfile(User user, String name, int age, String email) {
    assertThat(user.getName()).isEqualTo(name);
    assertThat(user.getAge()).isEqualTo(age);
    assertThat(user.getEmail()).isEqualTo(email);
}

完整測(cè)試示例:

public class ShoppingCartTest {
    @Test
    void clear_shouldRemoveAllItems() {
        // 準(zhǔn)備
        ShoppingCart cart = new ShoppingCart();
        cart.addItem(new Item("Book", 15.99));
        cart.addItem(new Item("Pen", 1.99));
        
        // 執(zhí)行
        cart.clear();
        
        // 驗(yàn)證
        assertThat(cart.isEmpty())
            .as("購(gòu)物車應(yīng)在清空后為空")
            .isTrue();
    }
 
    @Test
    void processOrder_shouldPersistToDatabase() {
        // 準(zhǔn)備
        OrderDao mockDao = mock(OrderDao.class);
        OrderService service = new OrderService(mockDao);
        Order order = new Order("ORDER-123");
        
        // 執(zhí)行
        service.processOrder(order);
        
        // 驗(yàn)證數(shù)據(jù)庫(kù)交互
        verify(mockDao).save(order);
    }
 
    @Test
    void setDiscount_shouldThrowForInvalidValue() {
        Product product = new Product();
        
        assertThatThrownBy(() -> product.setDiscount(-10))
            .isInstanceOf(IllegalArgumentException.class)
            .hasMessageContaining("折扣值非法");
    }
}

?關(guān)鍵結(jié)論?:

  1. Void 方法通過間接驗(yàn)證狀態(tài)變化或檢查方法行為進(jìn)行斷言
  2. 優(yōu)先使用 assertEquals/assertThat 檢查狀態(tài)變化
  3. 對(duì)依賴交互使用 Mockito 的 verify
  4. 異常場(chǎng)景用 assertThrows/assertThatThrownBy
  5. 復(fù)雜斷言使用自定義斷言方法保持可讀性

對(duì)于現(xiàn)代 Java 測(cè)試,推薦使用 ?AssertJ? 提供的豐富斷言(如 assertThat().isEmpty())和 ?Mockito? 進(jìn)行行為驗(yàn)證,比傳統(tǒng)的 JUnit 斷言更具表達(dá)力。

到此這篇關(guān)于java void方法單測(cè)斷言的三種實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)java void斷言內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Map集合中g(shù)et不存在的key值,會(huì)拋出異常嗎?

    淺談Map集合中g(shù)et不存在的key值,會(huì)拋出異常嗎?

    這篇文章主要介紹了淺談Map集合中g(shù)et不存在的key值,會(huì)拋出異常嗎?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 使用stream流多字段排序SpringBoot

    使用stream流多字段排序SpringBoot

    文章介紹了在Java8中使用stream流對(duì)對(duì)象的多個(gè)字段進(jìn)行排序的方法,首先準(zhǔn)備數(shù)據(jù),然后演示了單個(gè)字段和多個(gè)字段的排序操作,包括升序和降序,文章最后總結(jié)了單個(gè)字段排序和多個(gè)字段排序的區(qū)別,并鼓勵(lì)讀者參考和分享
    2025-11-11
  • Java詳細(xì)講解包的作用以及修飾符的介紹

    Java詳細(xì)講解包的作用以及修飾符的介紹

    本文主要講述的是包的使用和注意事項(xiàng)和四種訪問修飾符public,protected,默認(rèn)的,private的訪問范圍及實(shí)例,感興趣的朋友一起來看看
    2022-05-05
  • 詳解使用Spring Boot開發(fā)Web項(xiàng)目

    詳解使用Spring Boot開發(fā)Web項(xiàng)目

    這篇文章主要介紹了詳解使用Spring Boot開發(fā)Web項(xiàng)目,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫(kù)

    Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫(kù)

    這篇文章主要介紹了Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫(kù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • springboot遠(yuǎn)程debug調(diào)試全過程

    springboot遠(yuǎn)程debug調(diào)試全過程

    這篇文章主要介紹了springboot遠(yuǎn)程debug調(diào)試全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • spring boot集成pagehelper(兩種方式)

    spring boot集成pagehelper(兩種方式)

    這篇文章主要介紹了spring boot集成pagehelper(兩種方式),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • 以Java代碼的方式總結(jié)幾個(gè)典型的內(nèi)存溢出案例

    以Java代碼的方式總結(jié)幾個(gè)典型的內(nèi)存溢出案例

    作為程序員,多多少少都會(huì)遇到一些內(nèi)存溢出的場(chǎng)景,如果你還沒遇到,說明你工作的年限可能比較短,或者你根本就是個(gè)假程序員!哈哈,開個(gè)玩笑.今天分享給大家Java內(nèi)存溢出的相關(guān)案例,希望大家在日常工作中,盡量避免寫這些low水平的代碼,需要的朋友可以參考下
    2021-06-06
  • SpringBoot整合Java DL4J實(shí)現(xiàn)情感分析系統(tǒng)

    SpringBoot整合Java DL4J實(shí)現(xiàn)情感分析系統(tǒng)

    在當(dāng)今數(shù)字化時(shí)代,企業(yè)越來越重視用戶的反饋,以不斷改進(jìn)產(chǎn)品和服務(wù),自然語(yǔ)言處理技術(shù)為分析用戶評(píng)價(jià)提供了強(qiáng)大的工具,本文將介紹如何使用 Spring Boot 整合 Java Deeplearning4j 構(gòu)建一個(gè)情感分析系統(tǒng),需要的朋友可以參考下
    2024-10-10
  • java.lang.Runtime.exec的左膀右臂:流輸入和流讀取詳解

    java.lang.Runtime.exec的左膀右臂:流輸入和流讀取詳解

    這篇文章主要介紹了java.lang.Runtime.exec的左膀右臂:流輸入和流讀取詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評(píng)論

莲花县| 和林格尔县| 凤城市| 正阳县| 东方市| 临洮县| 乌什县| 丰宁| 顺平县| 莲花县| 宁波市| 焉耆| 峡江县| 项城市| 锡林浩特市| 文安县| 山阳县| 华坪县| 靖远县| 丰顺县| 太仓市| 桓仁| 荆州市| 鄂伦春自治旗| 中牟县| 怀柔区| 宝兴县| 五大连池市| 久治县| 建德市| 常宁市| 施甸县| 星子县| 阳东县| 定结县| 东海县| 玉环县| 阳朔县| 巧家县| 青川县| 西充县|