当前位置: 首页 > news >正文

解决单元测试 mock final类报错

文章目录

  • 前言
    • 解决单元测试 mock final类报错
      • 1. 报错原因
      • 2. 解决方案
      • 3. 示例demo
      • 4. 扩展

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


解决单元测试 mock final类报错

1. 报错原因

如果mock final类的话会报下面的错误。
在这里插入图片描述
原因是 Mockito 默认不支持 final 类和 final 方法的 mock,因此无法直接使用传统的 Mockito 进行 mock 。

2. 解决方案

因为我的项目使用的springBoot 版本为2.3.4,因此我对应的mockito-core版本为3.12.4

<dependency>
   <groupId>org.mockito</groupId>
   <artifactId>mockito-core</artifactId>
   <version>3.12.4</version>
   <scope>test</scope>
</dependency>

因此对于该版本我只能使用 PowerMock 的方式来进行 mock final类。
对应的pom:

<dependency>
   <groupId>org.powermock</groupId>
   <artifactId>powermock-module-junit4</artifactId>
   <version>2.0.9</version>
   <scope>test</scope>
</dependency>
<dependency>
   <groupId>org.powermock</groupId>
   <artifactId>powermock-api-mockito2</artifactId>
   <version>2.0.9</version>
   <scope>test</scope>
</dependency>

3. 示例demo

测试类:

public class TestController {


    @Autowired
    private TestOneService service;


    public void yyyy(HttpServletResponse response){
        HSSFWorkbook yyyy = service.yyyy();
        try {
            ServletOutputStream outputStream = response.getOutputStream();
            yyyy.write(outputStream);
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

单元测试类:


@RunWith(PowerMockRunner.class)
@PrepareForTest({HSSFWorkbook.class})
@PowerMockIgnore({"javax.net.ssl.*","javax.management.*"})
public class TestControllerTest {




    @InjectMocks
    TestController testController;


    @Mock
    TestOneService service;


    @Test
    public void test() throws IOException {
        HttpServletResponse response = Mockito.mock(HttpServletResponse.class);
        ServletOutputStream outputStream =  Mockito.mock(ServletOutputStream.class);


        HSSFWorkbook hssfWorkbook = PowerMockito.mock(HSSFWorkbook.class);
        PowerMockito.when(service.yyyy()).thenReturn(hssfWorkbook);
        PowerMockito.when(response.getOutputStream()).thenReturn(outputStream);


        testController.yyyy(response);
        Assert.assertTrue(true);
    }


}

这里的重点在于使用PowerMockito来进行mock:
HSSFWorkbook hssfWorkbook = PowerMockito.mock(HSSFWorkbook.class);
同时添加 HSSFWorkbook 以支持 mock
@PrepareForTest({HSSFWorkbook.class})
执行效果:

在这里插入图片描述

4. 扩展

如果你的 Spring Boot是 2.5 及以上版本中,可以使用 Mockito 4.x 版本,该版本 mocking 已经支持 final 类和 final 方法。

相关文章:

  • 盛京开源社区加入 GitCode,书写东北开源生态新篇章
  • 深入理解Java并发编程(一):揭秘并发性能优化的底层机制
  • 想转行做春晚那种扭秧歌的机器人,大概要会点什么?
  • 【SpringBoot】论坛项目中如何进行实现发布文章,以及更新对应数据库的数据更新
  • CCNA Started
  • 【MySQL学习】关系数据库标准语言SQL
  • 批量接受或拒绝 Word 修订
  • 加油站小程序实战教程04类目级联选择
  • mysql服务层介绍,NOSQL+SQL接口(nosql介绍),语法分析器,预处理器,优化器(优化的必要性,基于成本的优化器),缓存(弊端)
  • C#高级:结合Linq的SelectMany方法实现笛卡尔积效果
  • 【R语言】加权回归拟合
  • Stale file handle
  • 面试之《网络请求的资源如何强制不缓存》
  • 物联网驱动的智慧能源管理解决方案
  • 【Harmony OS Next】封装时间选择按钮
  • Java 关键字 volatile
  • 测试集指标统计
  • 类和对象——static修饰类的成员
  • 小红的质数数组(A组,B组)
  • C++错误Call to implicitly-deleted default constructor of ‘SerialPortConfig‘
  • 兴业证券:下半年A股指数稳、结构牛,中国资产重估刚刚开始
  • 经济日报评论员:拧紧“带头过紧日子”的制度螺栓
  • 深一度|上座率连创纪录撬动文旅,中超可否复制大连模式
  • 国家主席习近平任免驻外大使
  • 一周人物|收藏家瓦尔特捐出藏品,女性艺术家“对话”摄影
  • 中国证监会副主席李明:目前A股估值水平仍处于相对低位