java void方法單測(cè)斷言的三種實(shí)現(xiàn)示例
在 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é)論?:
- Void 方法通過間接驗(yàn)證狀態(tài)變化或檢查方法行為進(jìn)行斷言
- 優(yōu)先使用 assertEquals/assertThat 檢查狀態(tài)變化
- 對(duì)依賴交互使用 Mockito 的 verify
- 異常場(chǎng)景用 assertThrows/assertThatThrownBy
- 復(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ì)拋出異常嗎?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
詳解使用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ù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
springboot遠(yuǎn)程debug調(diào)試全過程
這篇文章主要介紹了springboot遠(yuǎn)程debug調(diào)試全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
以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)
在當(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的左膀右臂:流輸入和流讀取詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11

