mock静态方法指引
mock静态方法指引
mockito 在3.4.0版本开始支持mock static method
文档:https://wttech.blog/blog/2020/mocking-static-methods-made-possible-in-mockito-3.4.0/
1. 升级Maven依赖
<!-- mockito -->
<dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>3.6.28</version><scope>test</scope>
</dependency>
<dependency><groupId>org.mockito</groupId><artifactId>mockito-inline</artifactId><version>3.6.28</version><scope>test</scope>
</dependency>
<dependency><groupId>org.mockito</groupId><artifactId>mockito-junit-jupiter</artifactId><version>3.4.0</version><scope>test</scope>
</dependency>
2. 使用方式
- 静态方法
public final class MysteryBox {public static Optional<Mystery> amaze(String codeWord) {// todo}
}
- 待测试的类,使用了MysteryBox.amaze(String)静态方法
public class HaplessUser {public Mystery unleashMystery(String magicSpell) {Optional<Mystery> om = MysteryBox.amaze(magicSpell);return om.orElseThrow(() -> new FailureToAmazeException("The box was empty"));}
}
- 单元测试类,mock静态方法
@Test
@DisplayName("Should throw an exception upon failing to uncover mind-boggling mysteries")
void testUncoverMysteries() {// 1.在try代码块中实例化一个MockedStatic,使用范围仅仅在try代码块内try (MockedStatic<MysteryBox> mb = Mockito.mockStatic(MysteryBox.class)) {// 2. mock静态方法的调用mb.when(() -> { MysteryBox.amaze(any(String.class )) }).thenReturn(Optional.empty());// 3. 调用单元测试方法assertThrows(FailureToAmazeException.class, () -> subjectUnderTest.unleashMystery("Abracadabra"));}// 静态方法的mock在这里是不可用的
}
3. 异常情况
在同个测试类,当多个测试方法都需要mock调用某个静态方法时,代码如下
@ExtendWith(MockitoExtension.class)
public class KonfigurationCopyServiceTest {@InjectMocksprivate EKonfigurationCopyServiceImpl konfigurationCopyServiceImpl;@MockBeanprivate FileProcessRecordServiceImpl fileProcessRecordService;@BeforeEachpublic void setUp() {// mock静态方法MockedStatic<SpringUtil> mockSpringUtil = Mockito.mockStatic(SpringUtil.class);mockSpringUtil.when(() -> SpringUtil.getActiveProfile()).thenReturn("dev");}@Testvoid test1() {// 省略@Test的单元测试方法 }@Testvoid test2() {// 省略@Test的单元测试方法 }
}
此时,会抛出如下异常信息:
org.mockito.exceptions.base.MockitoException:
For xx.xxxx.util.SpringUtil, static mocking is already registered in the current threadTo create a new mock, the existing static mock registration must be deregistered
静态mock已经在当前线程中注册了,要创建新的mock,必须注销现有的静态mock注册
解决方式
- 导入
import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS;
- 在测试类上添加注解
@TestInstance(PER_CLASS)
- 使用
@BeforeAll
代替@BeforeEach
// 添加@TestInstance(PER_CLASS)注解
@TestInstance(PER_CLASS)
@ExtendWith(MockitoExtension.class)
public class KonfigurationCopyServiceTest {@InjectMocksprivate EKonfigurationCopyServiceImpl konfigurationCopyServiceImpl;@MockBeanprivate FileProcessRecordServiceImpl fileProcessRecordService;// 使用@BeforeAll mock静态方法@BeforeAllpublic void setUp() {// mock静态方法MockedStatic<SpringUtil> mockSpringUtil = Mockito.mockStatic(SpringUtil.class);mockSpringUtil.when(() -> SpringUtil.getActiveProfile()).thenReturn("dev");}@BeforeEachpublic void init() {// mock其他方法}@Testvoid test1() {// 省略@Test的单元测试方法 }@Testvoid test2() {// 省略@Test的单元测试方法 }
}
mock静态方法指引相关推荐
- Mockito3.8 如何mock静态方法 (如何mock PageHelper)
项目中遇到需要mock PageHelper,因为用到了startPage方法,而此方法是静态方法,如果需要mock静态方法,网上说法比较多的都是需要用Powermock,而这就需要引入新的依赖,这样 ...
- SpringBoot单元测试之mock静态方法
The article summary 1 为什么要对静态方法mock 2 如何使用`powermock`对静态方法`mock` 2.1 添加依赖 2.2 编写测试类 2.3 需要注意的问题 1 为什 ...
- SpringBoot单元测试Mock静态方法
这两天写单元测试碰到了一个问题,就是这个subnetmap里面的数据格式我不知道是怎么样的,所以直接mock掉返回自己指定的值吧. mockito库并不能 mock静态方法,需要依赖powermock ...
- junit5 mock静态方法 Mockito.mockStatic()
junit5 mock静态方法 环境 jdk11 , junit5 ,springboot pom <dependency><groupId>org.springframewo ...
- Spock测试框架如何Mock静态方法
1. 问题场景 在写单元测试时,难免会遇到需要Mock的静态方法.当使用Spock测试框架时,Spock提供Moc静态方法Mock只支持Groovy语言,无法支持Java语言实现的静态方法Mockin ...
- Mockito 如何 mock 静态方法
在实际工作当中,我们经常会遇到需要对静态方法进行 mock 的情况.在 mockito 2.x 的时代,我们需要借助 powmock 才能实现.当 mockito 进化到了 3.4.0 版本以后,也开 ...
- 使用Mockito mock静态方法
在单测的时候,很多场景需要对静态方法进行mock打桩 之前在mockito2.x的时代需要借助powmock的功能 mockito在3.4.0版本也开始支持了静态方法的mock,使用方法如下 引入依赖 ...
- java8中mock静态方法,使用Mockk模拟静态Java方法
We are currently working with java with kotlin project, slowly migrating the whole code to the latte ...
- Jmockit对类静态方法mock
Jmockit对类静态方法mock 首先要明确一点,一个类型被注释为@Mocked后,其所有方法包括静态方法都将处于mocked状态 类MethodClass包含一个静态方法与public方法 pub ...
最新文章
- 磁盘管理 ——RAID1+0卷+LVM
- 手把手教你学51单片机-c语言版期末考试,手把手从零教你学51单片机
- linux的基础知识——信号的概念
- android第三方推送实现,Android--利用第三方推送实现APP伪保活(小米篇)
- Golang 入门系列(十一)Go语言实现webapi
- 浙大 PAT b1009
- editthiscookie插件怎么安装_PPT插件——OK之安装篇
- php会不会被人工智能取代,人工智能真的会取代前端开发吗?
- Slog86_使用Sketch 设计ArthurSlog网站主页原型
- Oracle数户库、表导入导出
- 分类算法 -- 决策树ID3算法
- python二次函数拟合_Python实现——二次多项式回归(最小二乘法)
- LAN、MAN、WAN指的是什么网络
- Javascript中的shift() 、unshift() 和 pop()、push()区别
- Endnote使用笔记01:如何在Endnote 20中导入GB/T7714-2015引文格式
- ZDNS参与的《根服务器运行机构不端行为研究报告》正式发布,全球根服务器安全治理又进一步
- vs2019配置C#
- 空间分析与应用实验报告实验一燕麦试验田选址
- 计算机设备间使用面积,综合布线设计中的常用计算公式
- Linux内核进程,线程,进程组,会话组织模型以及进程管理
热门文章
- oracle如何将f8设置成执行,恢复F8(恢复到出厂设置)功能
- 让世界更平些:怎么查看昨日头条新闻?
- W32/Pate.a 病毒处理小记
- 2022 年 15 种最受欢迎​​的应用程序开发编程语言
- 某新商盟登录,js逆向:★★
- Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
- 切线空间、法线贴图、TBN矩阵
- 求幂级数展开的部分和
- iphone新旧手机数据传输已取消_新iPhone上手指南,新老果粉必看教程
- 阿语python4-1 django框架v5.0第3.1节视图介绍和项目准备