对多重继承关系的父子抽象类中子类的方法进行测试时如何回避Mock父类中的Protected方法

标题的说法就比较绕口,但是这个具体的问题大家看了下面内容就明白了。
如果在自己工作中遇到类似问题时可以试试这个解决办法。如果您技术好的话,其实不仔细看也行的,哈哈。

假设你有以下的类结构,该如何使用junit5,cdi-unit,mockito 来测试someMethod 方法呢?

public abstract class GrandParent extends  GreatGrandParent {protected final  DataBean getIndatabean(){Map<String,Object> inbean=form.getValue();return inbean;};
}public abstract class Parent extends GrandParent {public void someMethod() {Map<String,Object> inbean = super.getIndatabean();// 使用bean进行一些操作}
}

在这种情况下,由于 getIndatabean() 方法是 protected final,并且在 GrandParent 类中已经有具体的实现,你不能使用 Mockito 来直接 mock 这个方法。
此外,由于这个方法依赖于 form.getValue() 方法,我们需要考虑如何处理这个依赖。

一种可能的方法是使用 CDI-Unit 来提供依赖注入的功能,同时使用 Mockito 来 mock 那些依赖的部分。
这里,我们假设 form 是一个可以被注入的依赖。

首先,确保你的项目中已经加入了必要的依赖,如 JUnit 5, CDI-Unit, 和 Mockito。

1. 添加依赖
确保 pom.xml 包含以下依赖(版本号可能需要根据你的项目情况调整):

<dependencies><dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>4.0.0</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.8.1</version><scope>test</scope></dependency><dependency><groupId>org.jglue.cdi-unit</groupId><artifactId>cdi-unit</artifactId><version>5.0-RC1</version><scope>test</scope></dependency>
</dependencies>

2. 编写测试代码
接下来,编写测试代码。在这里,我们将使用 CDI-Unit 来创建一个测试环境,其中 Parent 类的实例被注入,并且 form 的依赖也被 mock。

import org.jglue.cdiunit.CdiRunner;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;import javax.inject.Inject;
import java.util.HashMap;
import java.util.Map;import static org.mockito.Mockito.*;@RunWith(CdiRunner.class)
public class ParentTest {@InjectMocksprivate Parent parent;@Mockprivate GreatGrandParent form;@Testpublic void testSomeMethod() {// 模拟form.getValue()返回值Map<String, Object> expectedMap = new HashMap<>();expectedMap.put("key", "value");when(form.getValue()).thenReturn(expectedMap);// 调用方法parent.someMethod();// 验证form.getValue()被调用verify(form).getValue();// 进行其他必要的验证,比如检查someMethod是否正确处理了返回的Map// 例如,你可以添加一些断言来验证someMethod的行为}
}

注意事项
CDI-Unit: 使用 CDI-Unit 可以方便地进行依赖注入,尤其是在测试环境中。
Mockito: 用于创建和管理 mock 对象。
JUnit 5: 进行单元测试。
这个示例假设 GreatGrandParent 类有一个可以被 mock 的 getValue() 方法。
如果实际情况不同,你可能需要调整 mock 的部分来适应实际代码的结构。

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

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

相关文章

以无侵方式实现Deployment原地升级

如何以无侵方式实现Deployment原地升级&#xff1f; 本文将展示如何以无侵、原生的方式实现Deployment原地升级。 在文章末尾会提供shell脚本供大家参考。 本文的原地升级仅指镜像更新 本篇kubernetes版本为v1.27.3。 原地升级的概念以及OpenKruise的实现方式可以参考文章&a…

Linux下GraspNet复现流程

Linux&#xff0c;Ubuntu中GraspNet复现流程 文章目录 Linux&#xff0c;Ubuntu中GraspNet复现流程1.安装cuda和cudnn2.安装pytorch3.编译graspnetAPIReference &#x1f680;非常重要的环境配置&#x1f680; ubuntu 20.04cuda 11.0.1cudnn v8.9.7python 3.8.19pytorch 1.7.0…

十大排序算法(java实现)

注&#xff1a;本篇仅用来自己学习&#xff0c;大量内容来自菜鸟教程&#xff08;地址&#xff1a;1.0 十大经典排序算法 | 菜鸟教程&#xff09; 排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大…

Microsoft Edge浏览器,便携增强版 v118.0.5993.69

01 软件介绍 Microsoft Edge浏览器&#xff0c;便携增强版&#xff0c;旨在无需更新组件的情况下提供额外的功能强化。这一增强版专注于优化用户体验和系统兼容性&#xff0c;具体包含以下核心功能的提升&#xff1a; 数据保存&#xff1a;通过优化算法增强了其数据保存能力&…

1707jsp电影视频网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 校园商城派送系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数…

Bugku Crypto 部分题目简单题解(三)

where is flag 5 下载打开附件 Gx8EAA8SCBIfHQARCxMUHwsAHRwRHh8BEQwaFBQfGwMYCBYRHx4SBRQdGR8HAQ0QFQ 看着像base64解码 尝试后发现&#xff0c;使用在线工具无法解密 编写脚本 import base64enc Gx8EAA8SCBIfHQARCxMUHwsAHRwRHh8BEQwaFBQfGwMYCBYRHx4SBRQdGR8HAQ0QFQ tex…

【嵌入式DIY实例】-DDS信号生成器

DDS信号生成器 文章目录 DDS信号生成器1、AD9805介绍2、硬件准备与接线3、代码实现在本文中,将详细介绍如何使用AD9850来搭建一个简易的DDS(Direct Digital signal )信号生成器。 1、AD9805介绍 AD9850是一款高度集成的器件,采用先进的DDS技术,内置一个高速、高性能数模转…

powershell@管道符过滤的顺序问题@powershell管道符如何工作

文章目录 select 和 where谁先执行powershell管道符stop-service 为例查看文档中的典型参数介绍stop-process为例介绍管道符传参是怎么工作的Id参数InputObject 参数Name参数额外的试验反面例子应用:get-process 和stop-process配合 select 和 where谁先执行 在执行筛选时&…

每日一练 | 华为认证真题练习 - OSPF 协议基础

★ 题目 关于OSPF&#xff08;开放最短路径优先&#xff09;邻居状态机的描述&#xff0c;以下哪项是正确的&#xff1f; A. Attempt 状态只在 NBMA&#xff08;非广播多路访问&#xff09;网络中出现 B. Attempt 状态只在 NBMA 和 P2MP&#xff08;点对多点&#xff09;网络…

Unity构建详解(12)——自动构建

【前言】 自动构建是指整个构建流程不需要人工操作&#xff0c;只需要输入启动构建指令即可获取构建结果。实现这样的自动构建需要满足以下条件&#xff1a; 支持命令行参数启动 我们不可能每次构建时都打开Unity去手动点击构建&#xff0c;必须支持通过命令行启动Unity自动执…

java.lang.NoSuchMethodException: com.ruoyi.web.controller.test.bean.HeadTeacher

软件开发过程中使用Java反射机制时遇到了下面的问题 com.ruoyi.web.controller.test.bean.HeadTeacher4b9af9a9 com.ruoyi.web.controller.test.bean.HeadTeacher4b9af9a9java.lang.NoSuchMethodException: com.ruoyi.web.controller.test.bean.HeadTeacher.<init>(java…

【软考高项】三十八、风险管理7个过程

一、规划风险管理 1、定义、作用 定义&#xff1a;定义如何实施项目风险管理活动的过程作用&#xff1a;确保风险管理的水平、方法和可见度与项目风险程度相匹配&#xff0c;与对组织和其他干系人的重要程度相匹配 2、输入 项目管理计划 项目章程 项目文件 干系人登记册…

C语言从头学04——介绍占位符和输出格式

占位符、输出格式都是与 printf() 相关的&#xff0c;当然其它函数也有用到占位符的。这里先介绍它们在 printf() 的使用。 一、先介绍占位符&#xff0c;所谓“占位符”通俗讲就是先占个位置&#xff0c;后边再找具体值(参数)代入进行显示的一种方法。先用一个例子说明…

【一刷《剑指Offer》】面试题 17:合并两个排序的链表

力扣对应题目链接&#xff1a;21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 核心考点&#xff1a;链表合并。 一、《剑指Offer》内容 二、分析题目 这道题的解题思路有很多&#xff1a; 可以一个一个节点的归并。可以采用递归完成。 三、代码 1、易于理解的…

Java 多线程补充

线程池 Java线程池是一种能够有效管理线程资源的机制&#xff0c;它可以显著提高应用性能并降低资源消耗。 线程池的主要优点包括&#xff1a; 资源利用高效&#xff1a;通过重用已存在的线程&#xff0c;减少了频繁创建和销毁线程带来的系统开销。响应速度提升&#xff1a;…

智慧公厕,小民生里的“大智慧”!

公共厕所是城市社会生活的基础设施&#xff0c;而智慧公厕则以其独特的管理模式为城市居民提供更优质的服务。通过智能化的监测和控制系统&#xff0c;智慧公厕实现了厕位智能引导、环境监测、资源消耗监测、安全防范管理、卫生消杀设备、多媒体信息交互、自动化控制、自动化清…

ThinkPHP+MySQL查询数据的时候计算两个经纬度之间的距离

需求&#xff0c;数据表中有lng&#xff08;经度&#xff09;lat&#xff08;维度&#xff09;两个字段&#xff0c;查询数据的时候要计算记录经纬度距离目标经纬度之间的距离。 方法中还有根据生日计算年龄(YEAR(CURDATE()) - YEAR(birthday)) AS age public function get_li…

抽象类基本概念

抽象类及抽象方法 概念&#xff1a;一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这种类被定义为抽象类&#xff0c;含有抽象方法的类也被称为抽象类。 用通俗的话来说就是当一个类的某个功能&#xff08;方法&#xff09;实现不确定时&#xff0c;我们就将该…

Java防挨骂--01

在遇到字符拼接需求时&#xff0c;习惯使用StringBuilder,而不要使用String. 因为String是不可变字符序列&#xff0c;在拼接时会产生新的String对象来进行拼接 StringBuider是可变字符序列&#xff0c;在拼接时效率和对资源的占用都表现更优。 StringBuffer也是可变字符序列…

一篇详解Git版本控制工具

华子目录 版本控制集中化版本控制分布式版本控制 Git简史Git工作机制Git和代码托管中心局域网互联网 Git安装基础配置git的--local&#xff0c;--global&#xff0c;--system的区别 创建仓库方式1git init方式2git clone git网址 工作区&#xff0c;暂存区&#xff0c;本地仓库…