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

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

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

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]刪除
最新教學 更多>
  • 如何將PANDAS DataFrame列轉換為DateTime格式並按日期過濾?
    如何將PANDAS DataFrame列轉換為DateTime格式並按日期過濾?
    將pandas dataframe列轉換為dateTime格式示例:使用column(mycol)包含以下格式的以下dataframe,以自定義格式:})指定的格式參數匹配給定的字符串格式。轉換後,MyCol列現在將包含DateTime對象。 date oped filtering > = ...
    程式設計 發佈於2025-07-04
  • HTML格式標籤
    HTML格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-07-04
  • 如何有效地轉換PHP中的時區?
    如何有效地轉換PHP中的時區?
    在PHP 利用dateTime對象和functions DateTime對象及其相應的功能別名為時區轉換提供方便的方法。例如: //定義用戶的時區 date_default_timezone_set('歐洲/倫敦'); //創建DateTime對象 $ dateTime = ne...
    程式設計 發佈於2025-07-04
  • 為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    程式設計 發佈於2025-07-04
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    在使用GO MOD時,在GO MOD 中克服模塊路徑差異時,可能會遇到衝突,其中3個Party Package將另一個PAXPANCE帶有導入式套件之間的另一個軟件包,並在導入式套件之間導入另一個軟件包。如迴聲消息所證明的那樣: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    程式設計 發佈於2025-07-04
  • 如何在無序集合中為元組實現通用哈希功能?
    如何在無序集合中為元組實現通用哈希功能?
    在未訂購的集合中的元素要糾正此問題,一種方法是手動為特定元組類型定義哈希函數,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    程式設計 發佈於2025-07-04
  • 如何使用Regex在PHP中有效地提取括號內的文本
    如何使用Regex在PHP中有效地提取括號內的文本
    php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
    程式設計 發佈於2025-07-04
  • 如何在php中使用捲髮發送原始帖子請求?
    如何在php中使用捲髮發送原始帖子請求?
    如何使用php 創建請求來發送原始帖子請求,開始使用curl_init()開始初始化curl session。然後,配置以下選項: curlopt_url:請求 [要發送的原始數據指定內容類型,為原始的帖子請求指定身體的內容類型很重要。在這種情況下,它是文本/平原。要執行此操作,請使用包含以下標頭...
    程式設計 發佈於2025-07-04
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-07-04
  • MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    在兩個條件下插入或更新或更新 solution:的答案在於mysql的插入中...在重複鍵更新語法上。如果不存在匹配行或更新現有行,則此功能強大的功能可以通過插入新行來進行有效的數據操作。如果違反了唯一的密鑰約束。 實現所需的行為,該表必須具有唯一的鍵定義(在這種情況下為'名稱'...
    程式設計 發佈於2025-07-04
  • Go語言垃圾回收如何處理切片內存?
    Go語言垃圾回收如何處理切片內存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片時,了解垃圾收集行為至關重要,以避免潛在的內存洩...
    程式設計 發佈於2025-07-04
  • 如何處理PHP文件系統功能中的UTF-8文件名?
    如何處理PHP文件系統功能中的UTF-8文件名?
    在PHP的Filesystem functions中處理UTF-8 FileNames 在使用PHP的MKDIR函數中含有UTF-8字符的文件很多flusf-8字符時,您可能會在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    程式設計 發佈於2025-07-04
  • 版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    在時間戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源於遺留實現的關注,這些限制需要對當前的_timestamp功能進行特定的實現。 創建表`foo`( `Productid` int(10)unsigned not ...
    程式設計 發佈於2025-07-04
  • 如何使用Python有效地以相反順序讀取大型文件?
    如何使用Python有效地以相反順序讀取大型文件?
    在python 中,如果您使用一個大文件,並且需要從最後一行讀取其內容,則在第一行到第一行,Python的內置功能可能不合適。這是解決此任務的有效解決方案:反向行讀取器生成器 == ord('\ n'): 緩衝區=緩衝區[:-1] ...
    程式設計 發佈於2025-07-04
  • 編譯器報錯“usr/bin/ld: cannot find -l”解決方法
    編譯器報錯“usr/bin/ld: cannot find -l”解決方法
    錯誤:“ usr/bin/ld:找不到-l “ 此錯誤表明鏈接器在鏈接您的可執行文件時無法找到指定的庫。為了解決此問題,我們將深入研究如何指定庫路徑並將鏈接引導到正確位置的詳細信息。 添加庫搜索路徑的一個可能的原因是,此錯誤是您的makefile中缺少庫搜索路徑。要解決它,您可以在鏈接器命令中添...
    程式設計 發佈於2025-07-04

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

Copyright© 2022 湘ICP备2022001581号-3