欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

在 Java 中對 void 方法進行單元測試斷言,主要通過以下三種策略實現(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)

當 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)部行為

?行為驗證場景?:

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

?自定義驗證器?:復雜狀態(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() {
        // 準備
        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("購物車應在清空后為空")
            .isTrue();
    }
 
    @Test
    void processOrder_shouldPersistToDatabase() {
        // 準備
        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)變化或檢查方法行為進行斷言
  2. 優(yōu)先使用 assertEquals/assertThat 檢查狀態(tài)變化
  3. 對依賴交互使用 Mockito 的 verify
  4. 異常場景用 assertThrows/assertThatThrownBy
  5. 復雜斷言使用自定義斷言方法保持可讀性

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

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

相關(guān)文章

  • Java實現(xiàn)象棋算法的示例代碼

    Java實現(xiàn)象棋算法的示例代碼

    象棋算法包括搜索算法、評估函數(shù)和剪枝算法,本文主要介紹了Java實現(xiàn)象棋算法的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Java簡化復雜系統(tǒng)調(diào)用的門面設(shè)計模式

    Java簡化復雜系統(tǒng)調(diào)用的門面設(shè)計模式

    Java門面模式是一種結(jié)構(gòu)性設(shè)計模式,它為復雜系統(tǒng)提供了一個簡單的接口,使得系統(tǒng)的客戶端能夠更加方便地使用系統(tǒng)功能。門面模式通過封裝復雜的子系統(tǒng),隱藏系統(tǒng)的實現(xiàn)細節(jié),提高了系統(tǒng)的易用性和靈活性
    2023-04-04
  • java8如何根據(jù)某一屬性條件快速篩選list中的集合

    java8如何根據(jù)某一屬性條件快速篩選list中的集合

    這篇文章主要介紹了java8如何根據(jù)某一屬性條件快速篩選list中的集合,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java利用openoffice將doc、docx轉(zhuǎn)為pdf實例代碼

    Java利用openoffice將doc、docx轉(zhuǎn)為pdf實例代碼

    這篇文章主要介紹了Java利用openoffice將doc、docx轉(zhuǎn)為pdf實例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • SpringBoot自定義Banner使用詳解

    SpringBoot自定義Banner使用詳解

    這篇文章主要介紹了SpringBoot自定義Banner使用詳解,啟動 Spring Boot 時,幾乎總是能在控制臺上方看到如下橫幅,這個也叫字符畫、英文ASCII藝術(shù)字,這就是banner,我們來看一下如何使用,需要的朋友可以參考下
    2024-01-01
  • ObjectMapper 如何忽略字段大小寫

    ObjectMapper 如何忽略字段大小寫

    這篇文章主要介紹了使用ObjectMapper實現(xiàn)忽略字段大小寫操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring基于常用AspectJ切點表達式使用介紹

    Spring基于常用AspectJ切點表達式使用介紹

    AspectJ是一個基于Java語言的AOP框架,使用AspectJ需要導入Spring?AOP和AspectJ相關(guān)jar包,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • Spring Boot超詳細講解請求處理流程機制

    Spring Boot超詳細講解請求處理流程機制

    SpringBoot是一種整合Spring技術(shù)棧的方式(或者說是框架),同時也是簡化Spring的一種快速開發(fā)的腳手架,本篇讓我們一起分析請求處理流程機制
    2022-07-07
  • 詳解JVM虛擬機的類加載機制

    詳解JVM虛擬機的類加載機制

    這篇文章主要介紹了詳解JVM虛擬機的類加載機制,虛擬機把描述類的數(shù)據(jù)從 Class 文件加載到內(nèi)存,并對數(shù)據(jù)進行校驗、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機直接使用的 Java 類型,這就是虛擬機的類加載機制,需要的朋友可以參考下
    2023-08-08
  • Java把數(shù)字格式化為貨幣字符串實例代碼

    Java把數(shù)字格式化為貨幣字符串實例代碼

    這篇文章主要介紹了Java把數(shù)字格式化為貨幣字符串實例代碼,需要的朋友可以參考下
    2014-02-02

最新評論