UT单元测试

Tips:在使用时一定要注意版本适配性问题

一、Mockito

1.1 Mock的使用

Mock 的中文译为仿制的,模拟的,虚假的。对于测试框架来说,即构造出一个模拟/虚假的对象,使我们的测试能顺利进行下去。

Mock 测试就是在测试过程中,对于某些 不容易构造(如 HttpServletRequest 必须在 Servlet 容器中才能构造出来)或者不容易获取 比较复杂 的对象(如 JDBC 中的 ResultSet对象),用一个 虚拟 的对象(Mock 对象)来创建,以便测试方法。

@Mock 注解用于创建模拟对象,而 @InjectMocks 注解用于注入依赖的模拟对象或真实对象到测试对象中。通常情况下,@Mock 和 @InjectMocks 会配合使用,在单元测试中提供模拟对象和被测试对象之间的依赖关系。

public class BookService {private BookRepository bookRepository;public BookService(BookRepository bookRepository) {this.bookRepository = bookRepository;}public Book findBook(String id) {return bookRepository.findById(id);}
}@ExtendWith(MockitoExtension.class)
class BookServiceTest {@Mockprivate BookRepository bookRepository;@InjectMocksprivate BookService bookService;@Testvoid findBook() {Book book = new Book("1", "Title");when(bookRepository.findById("1")).thenReturn(book);bookService.findBook("1");verify(bookRepository, times(1)).findById("1");}
}

创建了一个模拟的 BookRepository,并且使用了 @InjectMocks 将它注入到了 BookService 的实例中。

1.2  @Mock @Spy @InjectMocks

  • @Mock:创建一个模拟对象(mocked object)。对其进行设置后,@Mock 创建的对象会返回设置好的值而不是执行真实的逻辑。
  • @Spy:创建一个间谍对象(spied object)。它和真实的对象很类似,除非明确设定,否则都是调用真实的方法。
  • @InjectMocks:创建一个实例,其余用 @Mock(或 @Spy)注解创建的mock会被注入到用 @InjectMocks 注解的类中。

Q1:既然@spy调用的是真实方法,那我为什么要使用这个注解呢,我直接在需要模拟的方法时候使用mock不就可以了吗

A:@Spy 是在你只想模拟类的部分行为,而其他方法还希望执行真实的逻辑时非常有用的。

@Spy
List<String> spyList = new ArrayList<String>();@Test
public void testSpy() {spyList.add("one");spyList.add("two");// 在spy对象上设定返回预期值Mockito.doReturn(100).when(spyList).size();assertEquals(100, spyList.size());assertEquals("one", spyList.get(0));
}

1.3  @mockbean与@SpyBean

@MockBean 和 @SpyBean 是 Spring Boot 测试中常用的两个注解。下面是它们各自的特性:

  1. @MockBean

    • @MockBean 用于在 Spring 上下文中创建一个 Mock 对象,用它替换任何同类型的原有 Bean。
    • @MockBean 创建的mock对象没有任何实际行为,只返回预设的值。
    • 使用 @MockBean,你可以设置对其进行调用的各个方法的预期返回值。
  2. @SpyBean

    • @SpyBean 用于在 Spring 上下文中创建一个 Spy 对象,用它替换任何同类型的原有的 Bean。
    • @SpyBean 创建的 spy 对象基于实际的 Bean,事实上它就是原有 Bean 的一个复制体。除非明确地设定,否则它的方法调用结果与原有 Bean 完全相同。
    • 使用 @SpyBean,你可以监视(或跟踪)Bean 的行为,并能在需要时们改变某些方法的行为。

总的来说,@MockBean 和 @SpyBean 的核心区别是:@MockBean 创建的是一个可配置的纯 mock 对象,而 @SpyBean 则是基于一个实际对象的副本,这个副本中的方法调用能够反映出原有对象的行为。

使用场景:

@MockBean使用场景和代码示例

使用场景:我们通常在Spring的集成测试中使用@MockBean,这个注解用于替换Spring应用程序上下文中的现有Bean。它创建了一个Mock实例,并使用它替换原本的Bean。

@SpyBean使用场景和代码示例

使用场景:当我们希望监测真实的Bean时,我们使用@SpyBean。一个 Spy Bean 是一个代理,在这个代理中,被Spy的Bean的所有方法都会像平常一样被调用,除非我们明确地改变它们的行为。

 1.4 verify的使用方法及场景

Mockito.verify() 方法是 Mockito 框架中用于验证 mock 对象方法调用的工具。通过 verify() 方法,我们可以检查 mock 对象的某个方法是否被调用了,并可以进一步验证调用次数、调用顺序、传入参数等情况。

下面是 Mockito.verify() 方法的基本使用方法及一些常见应用场景:

验证方法是否被调用:

// 创建 mock 对象
List<String> mockList = Mockito.mock(List.class);// 调用被测试的方法
mockList.add("test");// 验证方法 add 是否被调用过一次
Mockito.verify(mockList).add("test");

这两个方法里面的参数必须一样才能进行验证。如果你要验证的方法参数与实际调用的方法参数不一样,那么 Mockito.verify() 方法会抛出异常并提示参数不匹配。

 验证方法被调用次数:

// 验证方法 add 被调用了两次
Mockito.verify(mockList, Mockito.times(2)).add("test");

 验证方法未被调用:

// 验证方法 add 未被调用
Mockito.verify(mockList, Mockito.never()).add("test");

 验证方法在特定顺序下被调用:

// 模拟方法调用
InOrder inOrder = Mockito.inOrder(mockList);
inOrder.verify(mockList).add("first");
inOrder.verify(mockList).add("second");

 验证方法传入参数:

// 验证方法 add 是否被调用,并且传入参数为字符串 "hello"
Mockito.verify(mockList).add(Mockito.eq("hello"));

 验证方法在特定时间内被调用:

// 验证方法 add 在100ms内是否被调用
Mockito.verify(mockList, Mockito.timeout(100)).add("test");

二、Junit5注解及断言

2.1 Junit5内置注解

2.2 junit5内置断言

三、Mockito 和 PowerMock的差异对比

Mockito 和 PowerMock 是两种广泛使用的 Java 单元测试模拟框架。它们都提供了创建和管理 mock 对象的能力,以帮助我们隔离并测试代码。然而,它们各自的特性使得它们在特定的场景中更有效。

Mockito 特性:

  1. 是目前最流行的 mocking 框架。
  2. 它能实现对方法的调用进行模拟,并验证方法的调用情况,通过一种优雅且简洁的 API 来提供这种功能。
  3. Mockito 不支持 mock 私有,静态和 fianl 方法或类的模拟
  4. Mockito 的语法简单且易于阅读,代码可维护性更高。
  5. Mockito 更关注于“测试行为”,而非“测试结果”。

PowerMock 特性:

  1. PowerMock 是 Mockito 和 EasyMock 的扩展,它能够模拟更加复杂的场景,包括静态方法,构造器,final 类及方法,私有方法等。
  2. PowerMock 使用字节码操作技术,通过在运行时修改字节码的方式实现这些复杂的模拟。
  3. PowerMock 能够执行更深层次的测试,但复杂的特性可能导致代码难以阅读和维护。
  4. PowerMock 适合用来模拟那些传统上被视为不可模拟的代码。

两者的主要使用场景:

  • Mockito 适合用于大多数标准的模拟情况,可以覆盖大部分的日常测试需求。其简单、易读的 API 使其成为首选工具。
  • PowerMock 的使用场景则更为具体,如必须模拟静态方法、final 类/方法或私有方法等情况。不过使用 PowerMock 应慎重,这些能力常常提示代码设计存在问题。

 使用powerMock模拟mock静态方法

public class UtilityClass {static int staticMethod(long value) {return 100;}
}@RunWith(PowerMockRunner.class)
@PrepareForTest(UtilityClass.class)
public class MockingStaticMethodTest {@Testpublic void testMockingStaticMethod() {//模拟整个 UtilityClass 类PowerMockito.mockStatic(UtilityClass.class);//设置预期返回PowerMockito.when(UtilityClass.staticMethod(5)).thenReturn(10);//在你的测试代码里, 当 UtilityClass.staticMethod(5) 被调用时, 它现在将返回 10int result = UtilityClass.staticMethod(5);assertEquals(10, result);//最后验证静态方法是否被调用PowerMockito.verifyStatic(UtilityClass.class);UtilityClass.staticMethod(5);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/806843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CVE-2023-38831】进行钓鱼攻击的研究

本文仅仅是对相关漏洞利用的学习记录&#xff0c;请各位合法合规食用&#xff01; WinRAR是一款文件压缩器,该产品支持RAR、ZIP等格式文件的压缩和解压等。WinRAR在处理压缩包内同名的文件与文件夹时代码执行漏洞,攻击者构建由恶意文件与非恶意文件构成的特制压缩包文件,诱导受…

C# wpf 嵌入外部程序

WPF Hwnd窗口互操作系列 第一章 嵌入Hwnd窗口 第二章 嵌入WinForm控件 第三章 嵌入WPF控件 第四章 嵌入外部程序&#xff08;本章&#xff09; 第五章 底部嵌入HwndHost 文章目录 WPF Hwnd窗口互操作系列前言一、如何实现&#xff1f;1、定义属性2、进程嵌入&#xff08;1&…

AugmentedReality之路-平面检测(5)

本文介绍通过AR检测水平平面和垂直平面&#xff0c;并将检测到的平面转化为Mesh 1、在首页添加功能入口 在首页添加一个按钮&#xff0c;命名为Start World Track 2、自定义ExecStartAREvent 创建ARSessionConfig并取名为ARSessionConfig_World 自定义ExecStartAREvent&…

大话设计模式之迭代器模式

迭代器模式是一种行为设计模式&#xff0c;它允许客户端逐个访问集合中的元素&#xff0c;而不暴露集合的底层表示。这种模式提供了一种方法来访问聚合对象中的各个元素&#xff0c;而不需要暴露其内部结构。 迭代器模式由以下几个关键角色组成&#xff1a; 迭代器&#xff08…

React 使用 three.js 加载 gltf 3D模型 | three.js 入门

系列文章 示例项目(gitcode)&#xff1a;https://gitcode.com/qq_41456316/simple-react-three-demo 文章目录 系列文章前言一、three.js是什么&#xff1f;二、使用 React 和 three.js 加载 glTF 3D 模型的步骤步骤 1&#xff1a;创建 React 应用步骤 2&#xff1a;安装 thre…

实现ElasticSearch搜索自动补全【同附Java代码实现和拼音分词器安装】

文章目录 1、简介2、拼音分词器3、自定义分词器4、自动补全查询5、实现酒店搜索框自动补全5.1、修改酒店映射结构5.2、修改HotelDoc实体5.3、重新导入5.4、自动补全查询的JavaAPI5.5、实现搜索框自动补全 6、资料分享链接 ​&#x1f343;作者介绍&#xff1a;双非本科大三网络…

linux查看网络连接数

目录 netstat top netstat 1.netstat查看当前主机上网络连接信息&#xff0c;端口号&#xff0c;pid,程序名等等 #直接查看 netstat -anp #一般使用的时候&#xff0c;可能要筛选 #比如8080端口是否被占用 netstat -anp | grep 8080 #minio服务占用了那些端口 netstat -anp …

unity数组

数组的定义 动态初始化:在定义数组时只指定数组的长度&#xff0c;由系统自动为元素赋初值的方式。 静态初始化:定义数组的同时就为数组的每个元素赋值 数组的静态初始化有两种方式 1、类型门数组名new 类型[]{元素&#xff0c;元素&#xff0c;…}; 2、类型[数组名{元素&am…

ubuntu20挂载webdav

WebDAV 是个好东西&#xff0c;尤其是配个自己的 NAS 使用&#xff0c;熟悉以后就再也离不开它啦 sudo apt-get update sudo apt-get install davfs2 上下左右键可以切换到“是”选项 2.创建目录挂载点 sudo mkdir /mnt/webdav 3.配置 davfs2 编辑 davfs2.conf 文件以配置 da…

Node.js 的 5 个常见服务器漏洞

Node.js 是一个强大且广泛使用的 JavaScript 运行时环境&#xff0c;用于构建服务器端应用程序。然而&#xff0c;与任何其他软件一样&#xff0c;Node.js 也有自己的一些漏洞&#xff0c;如果处理不当&#xff0c;可能会导致安全问题。请注意&#xff0c;这些漏洞并不是 Node.…

基于springboot的扶贫产品和扶贫物资捐赠系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的扶贫产品和扶贫物资捐赠系统2拥有管理员和用户角色 管理员&#xff1a;用户管理、扶贫项目管理、物资管理、扶贫产品管理、捐赠管理、资讯管理等 用户&#xff1a;捐赠…

nginx+uWsgi应用部署方式

uWSGI 是一个快速的、纯C语言开发的、自维护的、对开发者友好的 WSGI 服务器&#xff0c;旨在提供专业的 Python web应用发布和开发。可使用 C/C/Objective-C 来为 uWSGI 编写插件。在这里要区分三个概念&#xff1a; WSGI&#xff1a;全称是Web Server Gateway Interface&…

Visual Studio C++ 正确创建项目与更改文件名

1、创建项目 1&#xff09;打开Visual Studio&#xff0c;选择创建新项目。 2&#xff09;创建空项目 3&#xff09;配置新项目&#xff0c;注意不要勾选 " 将解决方案和项目放在同一目录中 " 。并将位置的文件夹设为与解决方案同名&#xff0c;方便管理。项目名称则…

spispi

硬件部分可参考我另一篇文章 http://t.csdnimg.cn/4j3qT 接线图 这是课程的相关接线图&#xff0c;独立看门狗和窗口看门狗都适用本图 独立看门狗部分 一、配置流程 1.开启时钟 在数据手册里面有这么一段解释&#xff0c;就是说如果我们开启了看门狗&#xff0c;那么LSI就…

PTA 2813:画家问题(熄灯问题)

有一个正方形的墙&#xff0c;由NN个正方形的砖组成&#xff0c;其中一些砖是白色的&#xff0c;另外一些砖是黄色的。Bob是个画家&#xff0c;想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i,j)个位置的砖时&#xff0c; 位置(i−1,j)、 (i1,j)、(i,j−1)、(i…

掌握判断IPv4地址是否正确的方法

在数字通信和互联网领域中&#xff0c;IPv4地址作为标识网络设备的核心元素&#xff0c;其正确性至关重要。一个有效的IPv4地址能够确保设备在网络中的正常通信和交互&#xff0c;而错误的IPv4地址则可能导致连接失败、通信中断甚至网络安全问题。因此&#xff0c;掌握判断IPv4…

SQL注入sqli_labs靶场第二题

解题思路与第一题相同 ?id1 and 11 和?id1 and 12进行测试如果11页面显示正常和原页面一样&#xff0c;并且12页面报错或者页面部分数据显示不正常&#xff0c;那么可以确定此处为数字型注入。 联合查询&#xff1a; 猜解列名数量&#xff1a;3 ?id1 order by 4 判断回显…

防止邮箱发信泄露服务器IP教程

使用QQ邮箱,网易邮箱,189邮箱,新浪邮箱,139邮箱可能会泄露自己的服务器IP。 泄露原理&#xff1a;服务器通过请求登录SMTP邮箱服务器接口&#xff0c;对指定的收件人发送信息。 建议大家使用商业版的邮箱&#xff0c;比如阿里云邮箱发信等 防止邮件发信漏源主要关注的是确保邮件…

机器学习和深度学习--李宏毅 (笔记与个人理解)Day7

Day7 Regression Case study &#xff08;预测宝可梦的cp&#xff09; Regression 可以做什么&#xff1f; 股票预测 自动驾驶 推荐 预测宝可梦的cp&#xff08;能力类似这样的属性把&#xff09; 这里突然想到&#xff0c;是不是可以用洛克王国和赛尔号做事情哈哈 注意&#…

6种xinput1_3.dll丢失的解决办法,并探讨xinput1_3.dll丢失的原因及其属性。

xinput1_3.dll扮演着Visual C运行时库中不可或缺的角色&#xff0c;众多电脑软件都需依赖它以确保正常运行。 当您启动软件时&#xff0c;若遇到xinput1_3.dll无法执行代码的提示&#xff0c;可能会导致软件无法如常启动或运行。本文将向您介绍6种解决方案&#xff0c;并探讨xi…