Spring Boot使用JUnit和Mockito進行Service層單元測試

文章目錄

  • 前言
  • 一、單元測試是什么
  • 二、為什么要寫單元測試
  • 三、簡單示例
    • 假設我們有一個簡單的UserService類,其中包含了一些用戶相關的邏輯:
    • 首先,我們需要引入JUnit和Mockito的依賴。在Maven項目中,可以在pom.xml文件中添加以下依賴:
    • 接下來,我們可以編寫UserService的單元測試:
    • 解析:
  • 總結


前言

??在平時的開發當中,一個項目往往包含了大量的方法,可能有成千上萬個。如何去保證這些方法產生的結果是我們想要的呢?那么在SpringBoot項目中我們是如何對Service層的方法進行測試的呢?


一、單元測試是什么

??單元測試是一種軟件測試方法,用于測試代碼的最小可測試單元。在Java開發中,編寫單元測試可以幫助開發人員更好地理解代碼的功能和實現,同時也可以提高代碼的質量和可維護性。


二、為什么要寫單元測試

  • 提高代碼質量:編寫單元測試可以幫助開發人員更好地理解代碼的功能和實現,從而更容易發現代碼中的問題和潛在的錯誤。

  • 提高代碼可維護性:單元測試可以幫助開發人員更好地理解代碼的實現,從而更容易進行維護和修改。

  • 提高開發效率:單元測試可以幫助開發人員更快地發現代碼中的問題和潛在的錯誤,從而減少調試和修復問題的時間。

  • 保證代碼的正確性:單元測試可以幫助開發人員驗證代碼的正確性,從而確保代碼的功能符合預期。

  • 支持持續集成和持續交付:單元測試可以作為持續集成和持續交付流程的一部分,確保代碼的質量和穩定性。


三、簡單示例

假設我們有一個簡單的UserService類,其中包含了一些用戶相關的邏輯:

@Service
public class UserService {private final UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public User createUser(User user) {// 一些創建用戶的邏輯return userRepository.save(user);}public User getUserById(Long id) {// 一些獲取用戶的邏輯return userRepository.findById(id).orElse(null);}
}

我們的目標是編寫UserService的單元測試。

首先,我們需要引入JUnit和Mockito的依賴。在Maven項目中,可以在pom.xml文件中添加以下依賴:

<dependencies><!-- 其他依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><scope>test</scope></dependency>
</dependencies>

接下來,我們可以編寫UserService的單元測試:

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {@Mockprivate UserRepository userRepository;@InjectMocksprivate UserService userService;@Testpublic void testCreateUser() {User user = new User();user.setId(1L);user.setUsername("John");user.setEmail("john@example.com");Mockito.when(userRepository.save(Mockito.any(User.class))).thenReturn(user);User createdUser = userService.createUser(user);assertNotNull(createdUser);assertEquals(1L, createdUser.getId().longValue());assertEquals("John", createdUser.getUsername());assertEquals("john@example.com", createdUser.getEmail());Mockito.verify(userRepository, Mockito.times(1)).save(Mockito.any(User.class));}@Testpublic void testGetUserById() {User user = new User();user.setId(1L);user.setUsername("John");user.setEmail("john@example.com");Mockito.when(userRepository.findById(1L)).thenReturn(Optional.of(user));User retrievedUser = userService.getUserById(1L);assertNotNull(retrievedUser);assertEquals(1L, retrievedUser.getId().longValue());assertEquals("John", retrievedUser.getUsername());assertEquals("john@example.com", retrievedUser.getEmail());Mockito.verify(userRepository, Mockito.times(1)).findById(1L);}
}

解析:

  • 在上述示例中,我們使用了Mockito的注解@Mock@InjectMocks來創建UserService的Mock對象并注入到被測試的userService對象中。
  • 在testCreateUser()方法中,我們使用Mockito的when()方法模擬了 userRepository的save()方法的行為,并返回預設的User對象。然后,我們調用userService的createUser()方法,并對返回的User對象進行斷言驗證。
  • 在testGetUserById()方法中,我們使用Mockito的when()方法模擬了userRepository的findById()方法的行為,并返回預設的User對象。然后,我們調用userService的getUserById()方法,并對返回的User對象進行斷言驗證。
  • 最后,我們使用Mockito的verify()方法來驗證userRepository的方法是否被調用了指定的次數。

這是一個簡單的Spring Boot Service層單元測試的示例。通過使用Mockito,我們可以模擬依賴對象的行為,使得單元測試更加可控和可靠。


總結

  • 本文簡單講述了單元測試是什么、為什么要寫單元測試和在SpringBoot項目中我們是如何編寫Service層單元測試的以及做了一個簡單示例
  • 歡迎大家提出建議以及批評,有任何問題可以私信。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214956.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214956.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214956.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多合一iPhone 解鎖工具:iMyFone LockWiper iOS

多合一iPhone 解鎖工具 無需密碼解鎖 iPhone/iPad/iPod touch 上所有類型的屏幕鎖定 在幾分鐘內解鎖 iPhone Apple ID、Touch ID 和 Face ID 立即繞過 MDM 并刪除 iPhone/iPad/iPod touch 上的 MDM 配置文件 支持所有 iOS 版本和設備&#xff0c;包括最新的 iOS 17 和 iPhone 1…

SQL語句---查詢數據

介紹 使用sql語句查詢數據。 命令 select 字段1,字段2 from 表名;例子 查詢指定字段&#xff1a; select id,name from a;使用*查詢所有字段&#xff1a; select * from a;

JAVA實操經驗

零&#xff1a; 按照需要&#xff0c;可以使用需要某個類下&#xff08;主要是java提供的&#xff09;的方法來實現某個功能。&#xff08;主要是用在不同類下的方法會進行重寫功能不同&#xff09; 方法和構造方法不同&#xff1a;方法是方法&#xff0c;構造方法是構造器&a…

Kotlin 中的 `use` 關鍵字:優化資源管理(避免忘記inputStream.close() ?)

在 Android開發中&#xff0c;正確且高效地管理資源是至關重要的。use 關鍵字在 Kotlin 中為資源管理提供了一個簡潔且強大的解決方案。它主要用于自動管理那些需要關閉的資源&#xff0c;比如文件、網絡連接等。 一、use 關鍵字的工作原理 &#x1f916; use 是一個擴展函數…

基于FPGA的視頻接口之高速IO

簡介 相對于其他視頻接口來說,高速IO接口(以Xilinx公司為例,spartan 6系列的GTP、Artix7系列的GTP,KENTEX7系列的GTX和GTH等)具有簡化設計、充分利用FPGA資源、降低設計成本等功能。 高速IO接口傳輸視頻,一般會被拓展為萬兆以太網、40G以太網、10G光纖、40G光纖、3G-SDI、…

c語言插入排序及希爾排序詳解

目錄 前言&#xff1a; 插入排序&#xff1a; 希爾排序&#xff1a; 前言&#xff1a; 排序在我們生活中無處不在&#xff0c;比如學生成就排名&#xff0c;商品價格排名等等&#xff0c;所以排序在數據結構的學習中尤為重要&#xff0c;今天就為大家介紹兩個經典的排序算法&…

adb 查找啟動的包名以及導出安裝包

查看安卓內包名 adb 查看所有安裝的包 adb shell pm list packages查看安裝的第三方app的包名 adb shell pm list packages -3查看啟動的app的包名 adb shell dumpsys activity top | find "ACTIVITY"adb shell dumpsys activity activities | findstr "Run…

深入解析C++中的虛函數和虛繼承:實現多態性與繼承關系的高級特性

這里寫目錄標題 虛函數虛函數實現動態綁定虛繼承抽象類 虛函數 虛函數是在C中用于實現多態性的一種特殊函數。它通過使用關鍵字"virtual"進行聲明&#xff0c;在基類中定義&#xff0c;可在派生類中進行重寫。虛函數允許在運行時根據對象的實際類型來調用相應的函數…

pip 通過git安裝庫

舉例&#xff1a;安裝peft庫 git clone https://github.com/huggingface/peft.git cd peft python -m pip install . 解釋&#xff1a; 使用git clone克隆PEFT庫的代碼。進入克隆的目錄。使用python -m pip install .來安裝PEFT庫。 補充&#xff1a;使用pip安裝到指定編譯器…

BigData之Google Hadoop中間件安裝

前言 Hadoop / Zookeeper / Hbase 因資源有限 這三個都是安裝在同一臺Centos7.9的機器上 但通過配置 所以在邏輯上是distributed模式 1 Java安裝 1.1 下載java11 tar/opt/java/jdk-11.0.5/ 1.2 環境配置修改 文件/etc/profile export JAVA_HOME/opt/java/jdk-11.0.5/ e…

新網站如何被搜索引擎迅速收錄

說到搜索引擎收錄新站的問題&#xff0c;大家應該對這個問題產生了一個共鳴&#xff0c;那就是要想要網站被收&#xff0c;難! 難于上青天。那是不是說這青天我們就上不了了呢&#xff0c;不是的&#xff0c;其實要想百度快速收錄新站&#xff0c;還是有訣竅的&#xff0c;關鍵…

【UE c++】 UE中c++如何使用回調(關卡動畫回調為例)

本文使用關卡動畫回調為例 1.創建關卡動畫 FString assetsPath "你的路徑"; FStringAssetReference sequenceName(assetsPath);ULevelSequence* sequenceAsset Cast<ULevelSequence>(sequenceName.TryLoad());ALevelSequenceActor* currentLevelSequenceAc…

HarmonyOS編譯開源native庫(OpenSSL實例)

前言 近期項目要開始做鴻蒙版本&#xff0c;有一部分依賴native的代碼也需要遷移&#xff0c;某個native模塊依賴openssl&#xff0c;需要在鴻蒙下重新編譯openssl才行。一開始找了很多相關文檔都沒有得到方法&#xff0c;無奈只能自己憑經驗慢慢試&#xff0c;最后還是成功了…

JS基礎之執行上下文

JS基礎之執行上下文 執行上下文順序執行可執行代碼執行上下文棧回顧上文 執行上下文 順序執行 寫個JavaScript的開發者都會有個直觀的印象&#xff0c;那就是順序執行&#xff1a; var foo function(){console.log(foo1) } foo(); //foo1 var foo function(){console.log(…

HTML面試題---專題一

文章目錄 一、前言二、 HTML5 中 <header> 和 <footer> 標簽的用途是什么&#xff1f;三、如何在 HTML 中嵌入 SVG&#xff08;可縮放矢量圖形&#xff09;文件&#xff1f;四、解釋 contenteditable 屬性的用途五、如何創建隨屏幕尺寸縮放的響應式圖像&#xff1f…

八大排序算法【上】

冒泡排序 冒泡排序是一種 穩定 的排序算法。 它的工作原理是每次檢查相鄰兩個元素&#xff0c;如果前面的元素與后面的元素滿足給定的排序條件&#xff0c;就將相鄰兩個元素交換。當沒有相鄰的元素需要交換時&#xff0c;排序就完成了。 假設我們想要從小到大進行排序&#…

大模型:常見的文字表情包(可以直接加到微調數據里)

大模型&#xff1a;常見的文字表情包(可以直接加到微調數據里) 返回論文目錄 返回資料目錄 表情符號含義&#x1f60a;愉快、微笑&#x1f602;大笑&#x1f60d;愛心眼&#x1f60e;酷、自信&#x1f914;思考、疑惑&#x1f61c;調皮、頑皮&#x1f64c;鼓掌、慶祝&#x1f…

線上扭蛋機小程序搭建,扭蛋與科技的完美結合

扭蛋機作為當下比較熱門的一種盲盒玩法&#xff0c;在年輕人群體中非常受歡迎。隨著經濟的增長和人們生活水平的提高&#xff0c;人們對娛樂消費需求也在增加&#xff0c;扭蛋機的受眾群體也在擴大。 目前線上扭蛋機小程序也獲得了大眾的青睞&#xff0c;扭蛋機小程序就是把線…

記錄一下快速上手Springboot登錄注冊項目

本教程需要安裝以下工具&#xff0c;如果不清楚怎么安裝的可以看下我的這篇文章 鏈接: https://blog.csdn.net/qq_30627241/article/details/134804675 管理工具&#xff1a; maven IDE&#xff1a; IDEA 數據庫&#xff1a; MySQL 測試工具&#xff1a; Postman 打開IDE…

Ansys結構靜力學仿真的一般流程

1. 模型實體 三維幾何模型的構建。 2. 材料屬性 根據實際情況&#xff0c;為模型中的各個部分定義材料屬性&#xff0c;包括彈性模量、泊松比、密度等。 3. 單元類型 node 結點數等 4. 網格劃分 網格屬性&#xff08;尺寸&#xff09; 5. 邊界條件 這個定義有點模糊&#x…