Java學習第二十部分——EasyMock

目錄

一.概述

二.作用

三.工作原理

四.使用示例

五.主要特點

六.適用場景

七.其他模擬框架比較

八.idea簡單項目實戰

1.打開idea創建Java項目,注意構建系統選“Maven”

2.為pom.xml文件添加如下依賴,并重新加載Maven依賴,直至不報錯

3.項目結構如下圖,按圖創建包,Java類文件和接口即可?

4.User類,UserRepositoryImpl類,UserService類代碼如下

5.接口和UserServiceTest類代碼如下

6.運行測試類,輸出結果如下

這說明:我們已經成功創建了一個使用 EasyMock 的 Java 項目并運行了單元測試。這個項目展示了如何使用 EasyMock 創建模擬對象、設置行為、驗證調用,以及如何結合 JUnit 進行單元測試。


一.概述

? ? ? ?EasyMock 是一個用于 Java 的模擬框架,它主要用于單元測試中創建和管理模擬對象(mock objects),幫助開發者在不依賴外部系統或實際對象的情況下進行測試。

二.作用


? ?- **模擬對象**:在單元測試中,某些對象可能依賴于外部系統(如數據庫、網絡服務等),或者某些對象的實現尚未完成。EasyMock 可以創建這些對象的模擬版本,從而讓測試代碼能夠獨立運行。
? ?- **行為驗證**:EasyMock 不僅可以模擬對象的行為,還可以驗證對象是否按照預期被調用,例如方法是否被調用、調用次數是否正確等。

三.工作原理


? ?- **創建模擬對象**:通過 EasyMock 提供的工具類(如 `MockBuilder` 或 `MockSupport`)創建目標對象的模擬版本。
? ?- **設置行為**:定義模擬對象在方法被調用時的返回值或行為。
? ?- **驗證行為**:在測試完成后,驗證模擬對象的方法是否被正確調用。

四.使用示例

以下示例展示如何使用 EasyMock 進行單元測試:
假設有一個 `UserService` 類,它依賴于一個 `UserRepository` 接口:


public interface UserRepository {
? ? User getUserById(int id);
}

public class UserService {
? ? private UserRepository userRepository;

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

? ? public User getUser(int id) {
? ? ? ? return userRepository.getUserById(id);
? ? }
}
?

接下來,使用 EasyMock 編寫單元測試代碼:


import org.easymock.EasyMock;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class UserServiceTest {
? ? @Test
? ? public void testGetUser() {
? ? ? ? // 創建模擬對象
? ? ? ? UserRepository userRepository = EasyMock.createMock(UserRepository.class);

? ? ? ? // 設置模擬對象的行為
? ? ? ? User expectedUser = new User(1, "Alice");
? ? ? ? EasyMock.expect(userRepository.getUserById(1)).andReturn(expectedUser);

? ? ? ? // 回放模擬對象
? ? ? ? EasyMock.replay(userRepository);

? ? ? ? // 創建 UserService 并注入模擬對象
? ? ? ? UserService userService = new UserService(userRepository);

? ? ? ? // 調用方法
? ? ? ? User actualUser = userService.getUser(1);

? ? ? ? // 驗證結果
? ? ? ? assertEquals(expectedUser, actualUser);

? ? ? ? // 驗證模擬對象是否被正確調用
? ? ? ? EasyMock.verify(userRepository);
? ? }
}
?

五.主要特點

? ?- **簡單易用**:提供了簡潔的 API,方便開發者快速創建和管理模擬對象。
? ?- **靈活的驗證方式**:可以驗證方法調用的次數、順序等。
? ?- **支持多種模擬類型**:包括普通對象、接口、抽象類等。

六.適用場景

? ?- **小型項目**:對于一些小型項目或簡單的單元測試場景,EasyMock 是一個不錯的選擇。
? ?- **學習模擬框架**:由于其簡單易用,EasyMock 也適合初學者學習模擬框架的基本概念。

? ? ? ?總之,EasyMock 是一個功能強大的模擬框架,雖然在功能上不如 Mockito 等現代框架強大,但它仍然是一個值得了解和使用的工具,特別是在一些簡單的單元測試場景中。

七.其他模擬框架比較

? ?- **Mockito**:Mockito 是目前最流行的 Java 模擬框架之一,它提供了更簡潔的語法和更強大的功能,例如對泛型的支持、更靈活的驗證方式等。Mockito 的使用方式更接近自然語言,代碼可讀性更高。
? ?- **JMockit**:JMockit 是一個功能強大的模擬框架,支持對靜態方法、構造函數等的模擬,但它的學習曲線相對較高。
? ?- **EasyMock**:雖然功能相對簡單,但它的學習成本較低,適合初學者入門。

八.idea簡單項目實戰

1.打開idea創建Java項目,注意構建系統選“Maven”

2.為pom.xml文件添加如下依賴,并重新加載Maven依賴,直至不報錯

<dependencies><!-- EasyMock --><dependency><groupId>org.easymock</groupId><artifactId>easymock</artifactId><version>5.2.0</version><scope>test</scope></dependency><!-- JUnit --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.0</version><scope>test</scope></dependency>
</dependencies>

3.項目結構如下圖,按圖創建包,Java類文件和接口即可

4.User類,UserRepositoryImpl類,UserService類代碼如下

package com.example;public class User {public static Class<?> classRepository;private int id;private String name;public User(int id, String name) {this.id = id;this.name = name;}public int getId() {return id;}public String getName() {return name;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User user = (User) o;return id == user.id && name.equals(user.name);}@Overridepublic int hashCode() {return id;}
}
package com.example.repository;import com.example.User;public class UserRepositoryImpl implements UserRepository {@Overridepublic User getUserById(int id) {// 假設從數據庫中獲取用戶信息return new User(id, "Alice");}
}
package com.example.service;import com.example.User;
import com.example.repository.UserRepository;public class UserService {private UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public User getUser(int id) {return userRepository.getUserById(id);}
}

5.接口和UserServiceTest類代碼如下

package com.example.repository;import com.example.User;public interface UserRepository {User getUserById(int id);
}
package com.example.service;import com.example.User;
import com.example.repository.UserRepository;
import org.easymock.EasyMock;
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.assertEquals;public class UserServiceTest {@Testpublic void testGetUser() {// 創建 Mock 對象UserRepository userRepository = EasyMock.createMock(UserRepository.class);// 設置期望行為User expectedUser = new User(1, "Alice");EasyMock.expect(userRepository.getUserById(1)).andReturn(expectedUser);// 回放 Mock 對象EasyMock.replay(userRepository);// 創建 UserService 并注入 Mock 對象UserService userService = new UserService(userRepository);// 執行測試User actualUser = userService.getUser(1);// 驗證結果assertEquals(expectedUser, actualUser);// 驗證 Mock 對象是否被正確調用EasyMock.verify(userRepository);}
}

6.運行測試類,輸出結果如下

這說明:我們已經成功創建了一個使用 EasyMock 的 Java 項目并運行了單元測試。這個項目展示了如何使用 EasyMock 創建模擬對象、設置行為、驗證調用,以及如何結合 JUnit 進行單元測試。

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

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

相關文章

機器學習模型在C++平臺的部署

一、概述機器學習模型的訓練通常在Python環境下完成&#xff0c;而現實生產環境的復雜性和多樣性使得模型的部署成為一個值得關注的重點。不同應用場景下有不同適應的實現方式&#xff0c;這里主要介紹通過一種通用中間格式——ONNX&#xff08;Open Neural Network Exchange&a…

保姆級安裝 Ruby 環境下載及安裝教程, RubyInstaller下載及安裝教程

一、下載安裝 RubyInstaller 1.打開 RubyInstaller 官網&#xff1a;https://rubyinstaller.org/ 點擊跳轉, 官網界面如下圖&#xff1a; 點擊下載最新的 RubyDevkit 版本&#xff08;如 RubyDevkit 3.4.X (x64) &#xff09;。如下圖所示&#xff1a; 注意點&#xff1a;如果…

SQL 一鍵生成 Go Struct!支持字段注釋、類型映射、結構體命名規范

SQL 一鍵生成 Go Struct&#xff01;支持字段注釋、類型映射、結構體命名規范 在 Golang 開發中&#xff0c;尤其是操作數據庫時&#xff0c;我們經常會遇到這種場景&#xff1a; ? 拿到數據庫建表 SQL&#xff0c;卻要手動寫 Go struct? 字段幾十個、類型復雜&#xff0c;…

Web 前端框架選型:React、Vue 和 Angular 的對比與實踐

Web 前端框架選型&#xff1a;React、Vue 和 Angular 的對比與實踐 選擇前端框架就像選擇一個長期合作伙伴。錯誤的選擇可能會讓你的項目在未來幾年內背負沉重的技術債務&#xff0c;而正確的選擇則能讓開發效率飛速提升。 經過多年的項目實踐&#xff0c;我發現很多新人在框架…

C# 值拷貝、引用拷貝、淺拷貝、深拷貝

值拷貝定義&#xff1a;直接復制變量的值&#xff0c;適用于基本數據類型&#xff08;如int, float, char等&#xff09;。在 C# 中&#xff0c;值類型&#xff08;基本數據類型和結構體&#xff09;默認使用值拷貝。特點&#xff1a;創建原始值的完全獨立副本&#xff0c;修改…

深度學習圖像分類數據集—百種鳥類識別分類

該數據集為圖像分類數據集&#xff0c;適用于ResNet、VGG等卷積神經網絡&#xff0c;SENet、CBAM等注意力機制相關算法&#xff0c;Vision Transformer等Transformer相關算法。 數據集信息介紹&#xff1a;525種鳥類識別分類 訓練數據集總共有84635張圖片&#xff0c;每個文件夾…

零基礎 “入坑” Java--- 八、類和對象(一)

文章目錄一、初識面向對象二、類的定義和使用1.認識類2.類的定義格式三、類的實例化四、this引用五、對象的構造及初始化1.有關初始化2.構造方法3.就地初始化一、初識面向對象 Java是一門純面向對象的語言&#xff08;OOP&#xff09;&#xff0c;在面向對象的世界里&#xff…

數字孿生技術引領UI前端設計新篇章:智能物聯網的深度集成

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;數字孿生與物聯網的共生革命在智能設備爆發式增長的今天&#xff0c;傳統…

代碼審計-shiro漏洞分析

一、關于shiro介紹 簡單講&#xff0c;shiro是apache旗下的一個Java安全框架&#xff0c;輕量級簡單易上手&#xff0c;框架提供很多功能接口&#xff0c;常見的身份認證 、權限認證、會話管理、Remember 記住功能、加密等等。 二、漏洞分析 1.CVE-2019-12422-shiro550 漏洞原理…

EF提高性能(查詢禁用追蹤)(關閉延遲加載)

EF默認是支持延遲加載的&#xff0c;在加載一個表的數據時&#xff0c;會把關聯表的數據一并加載&#xff0c;這樣會影響性能。 一般建議關閉延遲加載可以提高EF加載的性能。還有其他方法提高性能&#xff08;查詢禁用追蹤&#xff09; 如果要實現延遲加載&#xff0c;必須滿足…

Leetcode+JAVA+貪心III

134.加油站在一條環路上有 n 個加油站&#xff0c;其中第 i 個加油站有汽油 gas[i] 升。你有一輛油箱容量無限的的汽車&#xff0c;從第 i 個加油站開往第 i1 個加油站需要消耗汽油 cost[i] 升。你從其中的一個加油站出發&#xff0c;開始時油箱為空。給定兩個整數數組 gas 和 …

Qt信號與槽機制及動態調用

Qt信號與槽機制及動態調用一、信號與槽1、Qt信號與槽機制概述2、信號與槽的基本使用3、信號與槽的特性4、使用Lambda表達式作為槽5、信號與槽的參數傳遞6、注意事項二、動態調用機制1、基本用法2、示例代碼3、帶參數的調用4、返回值處理5、信號與槽的動態連接6、動態方法調用7、…

K8s系列之:Kubernetes 的 OLM

K8s系列之:Kubernetes 的 OLM 什么是 Kubernetes 的 OLM什么是Kubernetes中的OperatorOLM 的功能OLM 的核心組件OLM優勢OLM 的工作原理OLM 與 OperatorHub 的關系OLM示例場景什么是CRDoperator 和 CRD的關系為什么需要 CRD 和 OperatorCRD定義資源類型DebeziumServer如何使用d…

前端-HTML-day2

目錄 1、無序列表 2、有序列表 3、定義列表 4、表格-基本使用 5、表格-結構標簽 6、表格-合并單元格 7、表單-input基本使用 8、表單-input占位文本 9、表單-單選框 10、表單-上傳多個文件 11、表單-多選框 12、表單-下拉菜單 13、表單-文本域 14、表單-label標簽…

兩種方式清除已經保存的git賬號密碼

方式一隨便選擇一個文件夾&#xff0c;然后鼠標右鍵-》TortoiseGit ->設置選擇已保存的數據-》認證數據-》清除-》點擊確定方式二 控制面板\用戶帳戶\憑據管理器-》windows憑據普通憑據-》找到git信息-》選擇刪除

Using Spring for Apache Pulsar:Message Production

1. Pulsar Template在Pulsar生產者端&#xff0c;Spring Boot自動配置提供了一個用于發布記錄的PulsarTemplate。該模板實現了一個名為PulsarOperations的接口&#xff0c;并提供了通過其合約發布記錄的方法。這些send API方法有兩類&#xff1a;send和sendAsync。send方法通過…

CSS揭秘:10.平行四邊形

前置知識&#xff1a;基本的css變形一、平行四邊形 要實現一個平行四邊形&#xff0c;可以使用CSS的skew變形屬性來傾斜元素。 transform: skewX(-45deg);圖-1顯示容器和內容都出現了傾斜&#xff0c;該如何解決這個問題&#xff1f; 二、嵌套方案 我們通過將內容嵌套 div 并使…

深度學習 必然用到的 線性代數知識

把標量到張量、點積到范數全串起來&#xff0c;幫你從 0 → 1 搭建 AI 數學底座 &#x1f680; 1 標量&#xff1a;深度學習的最小單元 標量 就是一維空間里的“點”&#xff0c;只有大小沒有方向。例如溫度 52 F、學習率 0.001。 記號&#xff1a;普通小寫 x&#xff1b;域&am…

OpenGL ES 紋理以及紋理的映射

文章目錄開啟紋理創建紋理綁定紋理生成紋理紋理坐標圖像配置線性插值重復效果限制拉伸完整代碼在 Android OpenGL ES 中使用紋理&#xff08;Texture&#xff09;可以顯著提升圖形渲染的質量和效率。以下是使用紋理的主要好處&#xff1a; 增強視覺真實感 紋理可以將復雜的圖像…

從金字塔到個性化路徑:AI 正在重新定義學習方式

幾十年來&#xff0c;我們的教育系統始終遵循著一條熟悉的路線&#xff1a; 從小學、初中、高中&#xff0c;再到大學和研究生。這條標準化的路徑&#xff08;K-12 到研究所&#xff09;結構清晰&#xff0c;卻也緩慢。但在當今這個信息爆炸、知識快速更新、個性化需求高漲的時…