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

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

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

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

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

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

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

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

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

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

3. 驗證異常拋出

測試方法在非法輸入時的異常行為:

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

最佳實踐建議:

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

?行為驗證場景?:

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

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

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

完整測試示例:

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();
        
        // 驗證
        assertThat(cart.isEmpty())
            .as("購物車應(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);
        
        // 驗證數(shù)據(jù)庫交互
        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 方法通過間接驗證狀態(tài)變化或檢查方法行為進(jìn)行斷言
  2. 優(yōu)先使用 assertEquals/assertThat 檢查狀態(tài)變化
  3. 對依賴交互使用 Mockito 的 verify
  4. 異常場景用 assertThrows/assertThatThrownBy
  5. 復(fù)雜斷言使用自定義斷言方法保持可讀性

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

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

相關(guān)文章

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

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

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

    使用stream流多字段排序SpringBoot

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

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

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

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

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

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

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

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

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

    spring boot集成pagehelper(兩種方式)

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

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

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

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

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

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

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

最新評論

津南区| 泾阳县| 黄石市| 沙河市| 茌平县| 聂荣县| 巢湖市| 汶川县| 白银市| 屏边| 太康县| 星座| 滨州市| 洛宁县| 德昌县| 天祝| 徐水县| 桦甸市| 遂平县| 浙江省| 望谟县| 普格县| 罗江县| 铁力市| 台东县| 惠州市| 扶余县| 安宁市| 保德县| 易门县| 偏关县| 东乡县| 石楼县| 尤溪县| 华容县| 遂宁市| 谢通门县| 娱乐| 泗洪县| 峡江县| 宜川县|