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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;却也缓慢。但在当今这个信息爆炸、知识快速更新、个性化需求高涨的时…