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静态方法指引相关推荐

  1. Mockito3.8 如何mock静态方法 (如何mock PageHelper)

    项目中遇到需要mock PageHelper,因为用到了startPage方法,而此方法是静态方法,如果需要mock静态方法,网上说法比较多的都是需要用Powermock,而这就需要引入新的依赖,这样 ...

  2. SpringBoot单元测试之mock静态方法

    The article summary 1 为什么要对静态方法mock 2 如何使用`powermock`对静态方法`mock` 2.1 添加依赖 2.2 编写测试类 2.3 需要注意的问题 1 为什 ...

  3. SpringBoot单元测试Mock静态方法

    这两天写单元测试碰到了一个问题,就是这个subnetmap里面的数据格式我不知道是怎么样的,所以直接mock掉返回自己指定的值吧. mockito库并不能 mock静态方法,需要依赖powermock ...

  4. junit5 mock静态方法 Mockito.mockStatic()

    junit5 mock静态方法 环境 jdk11 , junit5 ,springboot pom <dependency><groupId>org.springframewo ...

  5. Spock测试框架如何Mock静态方法

    1. 问题场景 在写单元测试时,难免会遇到需要Mock的静态方法.当使用Spock测试框架时,Spock提供Moc静态方法Mock只支持Groovy语言,无法支持Java语言实现的静态方法Mockin ...

  6. Mockito 如何 mock 静态方法

    在实际工作当中,我们经常会遇到需要对静态方法进行 mock 的情况.在 mockito 2.x 的时代,我们需要借助 powmock 才能实现.当 mockito 进化到了 3.4.0 版本以后,也开 ...

  7. 使用Mockito mock静态方法

    在单测的时候,很多场景需要对静态方法进行mock打桩 之前在mockito2.x的时代需要借助powmock的功能 mockito在3.4.0版本也开始支持了静态方法的mock,使用方法如下 引入依赖 ...

  8. java8中mock静态方法,使用Mockk模拟静态Java方法

    We are currently working with java with kotlin project, slowly migrating the whole code to the latte ...

  9. Jmockit对类静态方法mock

    Jmockit对类静态方法mock 首先要明确一点,一个类型被注释为@Mocked后,其所有方法包括静态方法都将处于mocked状态 类MethodClass包含一个静态方法与public方法 pub ...

最新文章

  1. 磁盘管理 ——RAID1+0卷+LVM
  2. 手把手教你学51单片机-c语言版期末考试,手把手从零教你学51单片机
  3. linux的基础知识——信号的概念
  4. android第三方推送实现,Android--利用第三方推送实现APP伪保活(小米篇)
  5. Golang 入门系列(十一)Go语言实现webapi
  6. 浙大 PAT b1009
  7. editthiscookie插件怎么安装_PPT插件——OK之安装篇
  8. php会不会被人工智能取代,人工智能真的会取代前端开发吗?
  9. Slog86_使用Sketch 设计ArthurSlog网站主页原型
  10. Oracle数户库、表导入导出
  11. 分类算法 -- 决策树ID3算法
  12. python二次函数拟合_Python实现——二次多项式回归(最小二乘法)
  13. LAN、MAN、WAN指的是什么网络
  14. Javascript中的shift() 、unshift() 和 pop()、push()区别
  15. Endnote使用笔记01:如何在Endnote 20中导入GB/T7714-2015引文格式
  16. ZDNS参与的《根服务器运行机构不端行为研究报告》正式发布,全球根服务器安全治理又进一步
  17. vs2019配置C#
  18. 空间分析与应用实验报告实验一燕麦试验田选址
  19. 计算机设备间使用面积,综合布线设计中的常用计算公式
  20. Linux内核进程,线程,进程组,会话组织模型以及进程管理

热门文章

  1. oracle如何将f8设置成执行,恢复F8(恢复到出厂设置)功能
  2. 让世界更平些:怎么查看昨日头条新闻?
  3. W32/Pate.a 病毒处理小记
  4. 2022 年 15 种最受欢迎​​的应用程序开发编程语言
  5. 某新商盟登录,js逆向:★★
  6. Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
  7. 切线空间、法线贴图、TBN矩阵
  8. 求幂级数展开的部分和
  9. iphone新旧手机数据传输已取消_新iPhone上手指南,新老果粉必看教程
  10. 阿语python4-1 django框架v5.0第3.1节视图介绍和项目准备