• Mockito -- 如何Mock Util类中的static 方法?


    大家好,我是神韵,是一个技术&生活博主。出文章目的主要是两个,一是好记忆不如烂笔头,记录总结中提高自己。二是希望我的文章可以帮到大家。欢迎来点赞打卡,你们的行动将是我无限的动力。
    本篇主题是:Mockito -- 如何Mock Util类中的static 方法?

    比如要Mock下面的DateUtils类中static-convertLocalDateTimeToStr方法,下面只是一个例子,真实场景中可能非常复杂的xxUtils

    1. @NoArgsConstructor(access = AccessLevel.PRIVATE)
    2. public class DateUtils {
    3. public static String convertLocalDateTimeToStr(LocalDateTime localDateTime) {
    4. // 比较复杂的业务 假设~
    5. // 转化
    6. DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    7. return localDateTime.format(dateFormatter);
    8. }
    9. }

    1、引入依赖

    注意要引入mockito-inline依赖代替mockito-core,不然会报错

    1. org.springframework.boot
    2. spring-boot-starter-parent
    3. 2.5.1
    4. org.springframework.boot
    5. spring-boot-starter-test
    6. org.mockito
    7. mockito-inline

    2、编写测试类

    1. @RunWith(MockitoJUnitRunner.class)
    2. public class DateUtilsTest {
    3. @Test
    4. public void testConvertLocalDateTimeToStr() {
    5. String expectResult = "mock static method successful";
    6. MockedStatic dateUtilsMockedStatic = Mockito.mockStatic(DateUtils.class);
    7. dateUtilsMockedStatic.when(() -> DateUtils.convertLocalDateTimeToStr(Mockito.any())).thenReturn(expectResult);
    8. String result = DateUtils.convertLocalDateTimeToStr(LocalDateTime.now());
    9. Assert.assertEquals(expectResult, result);
    10. }
    11. }

    用Mockito.mockStatic对DateUtils进行mock之后,用when模拟相应行为就可以。例子中mock之后使之响应"mock static method successful"内容,然后用Assert对比mock是否成功。

    3、如果要多个测试类中使用,需要close掉mock static,不然会报只能在当前线程使用

    dateUtilsMockedStatic.close();

    1. @RunWith(MockitoJUnitRunner.class)
    2. public class DateUtilsTest {
    3. @Test
    4. public void testConvertLocalDateTimeToStr() {
    5. String expectResult = "mock static method successful";
    6. MockedStatic dateUtilsMockedStatic = Mockito.mockStatic(DateUtils.class);
    7. dateUtilsMockedStatic.when(() -> DateUtils.convertLocalDateTimeToStr(Mockito.any())).thenReturn(expectResult);
    8. String result = DateUtils.convertLocalDateTimeToStr(LocalDateTime.now());
    9. Assert.assertEquals(expectResult, result);
    10. dateUtilsMockedStatic.close();
    11. }
    12. @Test
    13. public void testConvertLocalDateTimeToStr2() {
    14. String expectResult = "mock static method successful";
    15. MockedStatic dateUtilsMockedStatic = Mockito.mockStatic(DateUtils.class);
    16. dateUtilsMockedStatic.when(() -> DateUtils.convertLocalDateTimeToStr(Mockito.any())).thenReturn(expectResult);
    17. String result = DateUtils.convertLocalDateTimeToStr(LocalDateTime.now());
    18. Assert.assertEquals(expectResult, result);
    19. dateUtilsMockedStatic.close();
    20. }
    21. }

    注意

    1、要引入mockito-inline依赖代替mockito-core,不然会报下面错误

    org.mockito.exceptions.base.MockitoException: 
    The used MockMaker SubclassByteBuddyMockMaker does not support the creation of static mocks

    Mockito's inline mock maker supports static mocks based on the Instrumentation API.
    You can simply enable this mock mode, by placing the 'mockito-inline' artifact where you are currently using 'mockito-core'.
    Note that Mockito's inline mock maker is not supported on Android.

    2、多个测试类没有close当前mockStatic时,会报下面错误

    org.mockito.exceptions.base.MockitoException: 
    For pers.xue.skills.util.DateUtils, static mocking is already registered in the current thread

    To create a new mock, the existing static mock registration must be deregistered

  • 相关阅读:
    Android-CAS与原子变量(无锁并发和有锁并发)
    怒刷LeetCode的第16天(Java版)
    系统学习SpringFrame:Spring概述
    Spring中自定义依赖注入对象注入Controller中,优雅的解决用户鉴权问题(HandlerInterceptorAdapter)
    hdfs常用命令行
    MySQL-基本概念与Select操作
    开源OA协同办公系统,集成Flowable流程引擎 可拖拽创建个性表单
    ESP8266远程控制电子门
    从零开始Blazor Server(6)--基于策略的权限验证
    【Java - L - 0102】- m - 二叉树的层序遍历
  • 原文地址:https://blog.csdn.net/qq_41055045/article/details/126977753