java void方法單測斷言的三種實現(xiàn)示例
在 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é)論?:
- Void 方法通過間接驗證狀態(tài)變化或檢查方法行為進行斷言
- 優(yōu)先使用 assertEquals/assertThat 檢查狀態(tài)變化
- 對依賴交互使用 Mockito 的 verify
- 異常場景用 assertThrows/assertThatThrownBy
- 復雜斷言使用自定義斷言方法保持可讀性
對于現(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簡化復雜系統(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-04java8如何根據(jù)某一屬性條件快速篩選list中的集合
這篇文章主要介紹了java8如何根據(jù)某一屬性條件快速篩選list中的集合,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Java利用openoffice將doc、docx轉(zhuǎn)為pdf實例代碼
這篇文章主要介紹了Java利用openoffice將doc、docx轉(zhuǎn)為pdf實例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-01-01