」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 JUnit 和 Mockito 在 Spring Boot 中自動化測試

使用 JUnit 和 Mockito 在 Spring Boot 中自動化測試

發佈於2024-11-09
瀏覽:946

Automating Tests in Spring Boot with JUnit and Mockito

在軟體開發中,維護高品質的程式碼至關重要,尤其是當系統變得越來越複雜時。自動化測試在確保新功能不會破壞現有功能以及程式碼隨著時間的推移保持健壯和可靠方面發揮關鍵作用。對於 Spring Boot 應用程序,JUnit 和 Mockito 分別是用於單元測試和模擬依賴項的兩個最受歡迎的工具。在這篇文章中,我們將探討如何利用這些工具在 Spring Boot 中建立有效的自動化測試,確保您的應用程式保持穩定且可維護。

JUnit 是一種廣泛使用的 Java 測試框架,它提供註解和斷言來幫助有效地建立和執行測試。它允許開發人員編寫可重複的測試並支援單元測試和整合測試。另一方面,Mockito 是一個功能強大的模擬框架,可以創建用於測試目的的模擬物件。它允許開發人員模擬複雜依賴關係的行為,隔離測試中的功能。透過將 JUnit 與 Mockito 結合使用,我們可以徹底測試 Spring Boot 應用程式的業務邏輯,而無需依賴實際的資料庫連接、外部服務或複雜的配置。

讓我們深入研究一個實際範例,看看如何在 Spring Boot 應用程式中一起使用 JUnit 和 Mockito。我們將建立一個簡單的服務類別並使用 JUnit 和 Mockito 為其編寫測試。

假設我們有一個 UserService 類,它依賴 UserRepository 來取得使用者資料:

@Service
public class UserService {

    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User getUserById(Long id) {
        return userRepository.findById(id)
                .orElseThrow(() -> new UserNotFoundException("User not found"));
    }
}

這裡,UserService 依賴 UserRepository,這是一個 Spring Data JPA 儲存庫介面。為了在不存取資料庫的情況下測試 getUserById 方法,我們可以使用 Mockito 來模擬 UserRepository 和 JUnit 來斷言 UserService 的行為。

以下是我們為 UserService 編寫測試的方法:

@SpringBootTest
public class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @BeforeEach
    public void setUp() {
        MockitoAnnotations.openMocks(this);
    }

    @Test
    public void testGetUserById_Success() {
        // Arrange
        User user = new User(1L, "John Doe", "[email protected]");
        when(userRepository.findById(1L)).thenReturn(Optional.of(user));

        // Act
        User result = userService.getUserById(1L);

        // Assert
        assertEquals("John Doe", result.getName());
        assertEquals("[email protected]", result.getEmail());
    }

    @Test
    public void testGetUserById_UserNotFound() {
        // Arrange
        when(userRepository.findById(1L)).thenReturn(Optional.empty());

        // Act & Assert
        assertThrows(UserNotFoundException.class, () -> userService.getUserById(1L));
    }
}

在 UserServiceTest 類別中,我們使用 @Mock 註解建立 UserRepository 的模擬實例,並使用 @InjectMocks 註解將此模擬注入到 UserService 中。 setUp 方法在每次測試之前初始化模擬。

然後我們定義兩個測試:

testGetUserById_Success:此測試驗證當 UserRepository 找到使用者時,UserService 是否會傳回正確的使用者。
testGetUserById_UserNotFound:此測試可確保當 UserRepository 傳回空結果時,UserService 拋出 UserNotFoundException。
這些測試使我們能夠驗證 UserService 的行為,而無需依賴實際的資料庫,從而使它們更快、更可靠。

在 Spring Boot 應用程式中使用 JUnit 和 Mockito 進行自動化測試提供了確保程式碼品質和應用程式穩定性的強大方法。透過編寫全面的單元測試,開發人員可以在開發過程的早期發現錯誤,從而更輕鬆地重構程式碼並充滿信心地添加新功能。 JUnit 和 Mockito 的組合允許清晰、簡潔的測試,專注於應用程式的業務邏輯,而不受外部依賴關係的複雜性的影響。

將自動化測試作為核心實踐不僅可以提高程式碼庫的可靠性,還可以增強整體開發工作流程。透過將這些測試整合到 CI/CD 管道中,您可以確保品質檢查自動化且一致,從而為更敏捷和有彈性的開發流程鋪平道路。因此,無論您是開始一個新專案還是增強現有項目,都可以將 JUnit 和 Mockito 的自動化測試作為您開發策略的一部分。

版本聲明 本文轉載於:https://dev.to/matheusmartinello/automating-tests-in-spring-boot-with-junit-and-mockito-49ip?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 我們如何計算 JavaScript 物件的大致記憶體佔用量?
    我們如何計算 JavaScript 物件的大致記憶體佔用量?
    確定 JavaScript 物件的記憶體佔用在 JavaScript 中,了解物件的記憶體消耗對於優化效能和避免記憶體洩漏至關重要。本文解決了獲取 JavaScript 物件大小的查詢,深入研究了估計此類物件所佔用的大致記憶體的解決方案。 確定物件大小In JavaScript 中沒有專門設計的內建...
    程式設計 發佈於2024-11-16
  • 從本地主機到生產:OneBootcamp 的問題優先 SRE 之旅
    從本地主機到生產:OneBootcamp 的問題優先 SRE 之旅
    我在X(以前的Twitter)上遇到了One2N 舉辦的一個問題優先的SRE 訓練營(在這裡你可以構建一個應用程序,並將其從本地主機擴展到生產環境),我想,「哎呀是啊!我會嘗試一下。」這篇部落格文章開啟了我的旅程,我將記錄我在訓練營中處理每項練習的經驗。 這篇介紹文章將連結到其他條目,詳細介紹我對...
    程式設計 發佈於2024-11-16
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-16
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-16
  • 如何在Python中遞歸搜尋子資料夾並檢索檔案?
    如何在Python中遞歸搜尋子資料夾並檢索檔案?
    遞歸子資料夾搜尋與檔案擷取在程式設計領域,遍歷目錄和擷取檔案可能是一項常見任務。一種有效的方法是採用遞歸演算法搜尋子資料夾並累積滿足特定條件的檔案清單。 遇到的問題使用者遇到了障礙嘗試在遞歸子資料夾搜尋中建立特定檔案的清單時。該問題源於子資料夾變數拉入子資料夾清單而不是包含該檔案的目前資料夾。 子資...
    程式設計 發佈於2024-11-16
  • 如何使用 CSS 建立倒數計時器
    如何使用 CSS 建立倒數計時器
    Written by Carlos Mucuho✏️ Countdown timers are a popular feature on many websites, enhancing functionality for events, sales, and user engagement. Wh...
    程式設計 發佈於2024-11-16
  • ## 像素完美縮小可以在瀏覽器大小調整期間保存影像品質嗎?
    ## 像素完美縮小可以在瀏覽器大小調整期間保存影像品質嗎?
    透過縮小尺寸重新取樣會降低影像品質? 此處的目標是縮小影像的大小,同時在瀏覽器環境中保持其品質。使用 HTML5 畫布縮小影像時會出現此問題,導致影像品質下降。 縮小尺寸與插值縮小尺寸和插值是不同的技術。縮小是指透過組合來源影像中的像素以在目標影像中建立較少的像素來減小影像尺寸,而插值是指在放大時在...
    程式設計 發佈於2024-11-16
  • Python 3.x 的 super() 函數在沒有參數的情況下如何運作,有哪些潛在的陷阱以及如何避免它們?
    Python 3.x 的 super() 函數在沒有參數的情況下如何運作,有哪些潛在的陷阱以及如何避免它們?
    揭開Python 3.x神奇Super()的秘密Python 3.x引入了super()函數的一個特殊方面:可以在沒有參數的情況下呼叫它。這種看似平凡的行為隱藏了編譯時魔法和執行時間支援的強大組合,提供了巨大的靈活性和效率。 隱藏的編譯時魔法透過無參數的 super() 調用,Python 編譯器在...
    程式設計 發佈於2024-11-16
  • PHP如何將變數轉換為字串?
    PHP如何將變數轉換為字串?
    PHP中的字串轉換Java和.NET程式設計師可能習慣toString()方法,它提供了一種便捷的轉換方式任何物件到字串表示形式。 PHP 透過轉換運算子提供類似的功能。 PHP 的轉換運算子要將 PHP 變數轉換為字串,可以使用 (string) 轉換運算子。此語法允許您將任何類型的變數明確轉換為...
    程式設計 發佈於2024-11-16
  • 如何修復「無法將 MySQL 日期/時間值轉換為 System.DateTime」錯誤?
    如何修復「無法將 MySQL 日期/時間值轉換為 System.DateTime」錯誤?
    了解「無法將MySQL 日期/時間值轉換為System.DateTime」錯誤從MySQL 資料庫檢索資料有時會導致錯誤「無法將MySQL 日期/時間值轉換為System.DateTime」。當從資料庫檢索的資料的 DbType 與 .NET 資料類型的對應屬性不相容時,就會發生這種情況。 修正轉換...
    程式設計 發佈於2024-11-16
  • 如何使用 PDO 準備語句將多行插入資料庫?
    如何使用 PDO 準備語句將多行插入資料庫?
    使用PDO 準備好的語句插入多行使用單一準備好的語句將多行插入資料庫不僅是可能的,而且推薦用於使用單一插入查詢的方法第一種方法涉及使用具有多個值的單一INSERT 查詢:INSERT INTO Table (col1, col2, col3) VALUES ('abc', 'def', 'ghi'...
    程式設計 發佈於2024-11-16
  • Java中如何計算兩個日期之間的天數?
    Java中如何計算兩個日期之間的天數?
    在Java 中計算兩個日期之間的天數在Java 程式語言中,計算兩個日期之間的天數可以很簡單任務。但是,當日期儲存為字串時,需要仔細轉換才能準確處理它們。 將字串日期轉換為日期物件要有效地處理日期,您可以將它們從字串轉換為 Date 或 LocalDate 類型。 Java 提供了各種類別和方法來促...
    程式設計 發佈於2024-11-16
  • 如何使用“...”標記在 C++ 可變參數模板中打包和解包參數?
    如何使用“...”標記在 C++ 可變參數模板中打包和解包參數?
    可變參數範本中「...」標記的語法規則在C 中,可變參數範本可以建構接受參數數量可變。 「...」標記在此上下文中起著至關重要的作用,充當參數包或參數解包器。 省略號放置的語法規則The “...”標記的位置決定了其功能:Pack : 當它出現在名稱的左邊時,「...」表示參數套件: ...thin...
    程式設計 發佈於2024-11-16
  • 如何有效地從 JavaScript 中的另一個陣列中存在的陣列中刪除元素?
    如何有效地從 JavaScript 中的另一個陣列中存在的陣列中刪除元素?
    高效刪除與另一個陣列相符的陣列元素在JavaScript 中,可能需要刪除一個陣列中存在於另一個陣列中的元素。這可以有效地實現,而無需借助循環和拼接。 jQuery 方法使用jQuery,可以利用grep() 和inArray() 函數:myArray = $.grep(myArray, funct...
    程式設計 發佈於2024-11-16
  • 很棒的免費 Tailwind 登陸頁面模板
    很棒的免費 Tailwind 登陸頁面模板
    幾個月前,我開源了一個 tailwind 登陸頁面模板列表,從那時起它就變得越來越流行,所以這裡是存儲庫中的一些頂級 tailwind 登陸頁面。 你在 Github 上查看它們並複製資料夾 從Github獲取⭐️ 或您也可以從網頁目錄下載 從網路下載 1.Pixa AI - Pi...
    程式設計 發佈於2024-11-16

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3