PowerMockito单元测试(1)-主要思想以及常规异常覆盖

2023-11-01

        

1. 测试主要操作步骤:

        【要测试的方法】:
@Component
public class UserDao{
	@Autowired
	private UserMapper userMapper
	@Autowired
	private SystemErrorRecoder systemErrorRecoder
	
	public List<UserDTO> getUsers(String userName){
		List<UserDTO> userDtos = null;
		try{
			userDtos = userMapper.getUsers(userName);
		}catch(DataAccessException e){
			systemErrorRecoder.addMsgError(e.getMessage());
		}
	
		if(CollectionUtils.isEmpty(userDtos)){
			return new ArrayList();
		}
		return userDtos;
	}
}
        【测试方法】:
@RunWith(PowerMockRunner.class)	// 必要,确保使用PowerMock框架引擎执行单元测试
@PowerMockIgnore("javax.management.*")//解决报错previously initiated loading for different type with name "javax/managemen
public class UserDaoTest[
	private UserDao userDao;
	private	UserMapper userMappers;
	private	SystemErrorRecoder systemErrorRecoder;
	
	@Before//在@Test代码执行前执行,用于初始化
	public void setUp(){
		userDao = new UserDao();
		userMappers = PowerMockito.mock(UserMapper.class)//mock获得UserMapper类的代理对象
 		systemErrorRecoder = PowerMockito.mock(SystemErrorRecoder.class);
		Whitebox.setInternalState(userDao,"userMapper",userMappers)//为本类的userDao对象的私有属性userMapper赋值userMappers
		Whitebox.setInternalState(userDao,"systemErrorRecoder",systemErrorRecoder)}
	
	@Test
	public void testGetUsers(){
		List<UserDTO> userDtos = new ArrayList<>();
		userDtos.add(new UserDTO);
		userDtos.add(new UserDTO);
		PowerMockito.when(userMappers.getUsers("test").thenReturn(userDtos);
		Assert.assertEuqals(userDtos,userDao.getUsers("test"))
		//以上覆盖除了Catch内的代码(先测试覆盖没有异常的代码)
		
		//a.对异常打桩
		DataAccessException exception = PowerMockito.mock(DataAccessException.class);
		//b.模拟try内的方法,doThrow异常
		PowerMockito.doThrow(exception).when(userMappers).getUsers("test")
		//c.模拟catch内的方法(如果catch内不涉及别的方法,可以省略)
		PowerMockito.doNothing().when(systemErrorRecoder).addMsgError(Mockito.anyString())
		//d.验证异常后返回的结果
		Assert.assertTure(CollectionUtils.isEmpty(userDao.getUsers("test")))
        【异常覆盖】:

   如上通过doThrow来覆盖,先测试catch外的,再测试异常的代码,否则可能会报test should never throw an exception to this level

        【主要思想】:

   ①. new出来的测试方法类对象是真实对象,即userDao为真实对象,那么其属性userMapper也是真实属性

   ②. 通过mock出来的对象为代理对象,即userMappers为代理对象

   ③. 将代理对象映射到真实对象属性:Whitebox.setInternalState

   ④. 通过PowerMockito.when来期望代理对象干什么,以及期望返回什么,如:
     PowerMockito.when(userMappers.getUsers(“test”).thenReturn(userDtos);
     期望userMappers执行getUsers方法,如何访问期望的userDtos对象

   ⑤. 当真实对象触发同样的方法时,实际执行的时代理代理对象的方法;
     代理对象执行方法期望的返回值,即期望值;真实对象执行方法后的返回值,即真实值
     所以,当测试userDao.getUsers方法时,通过判断期望值与真实值是否一致,就可以知道测试方法是否正确;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerMockito单元测试(1)-主要思想以及常规异常覆盖 的相关文章

  • 重构——套接字中的良好实践——简单的服务器-客户端 Swing 应用程序

    我使用单例和观察者模式编写了一个带有 Swing 接口的简单服务器 客户端程序 每个客户端都连接到服务器并可以发送消息 服务器将其收到的消息转发给其余的客户端 客户端使用 GUI 允许它们随时连接和断开与服务器的连接 该程序运行得很好 因为
  • H264 字节流到图像文件

    第一次来这里所以要温柔 我已经在给定的 H 264 字节流上工作了几个星期 一般注意事项 字节流不是来自文件 它是从外部源实时提供给我的 字节流使用 Android 的媒体编解码器进行编码 当将流写入扩展名为 H264的文件时 VLC能够正
  • 在哈希图中存储字符和二进制数

    我正在尝试存储字母到二进制数的映射 这是我的映射 h 001 i 010 k 011 l 100 r 101 s 110 t 111 为此 我创建了一个哈希映射并存储了键值对 我现在想显示给定句子的相应二进制值 这是我的代码 package
  • WebLogic 10 中的临时目录

    每当 WL 停止时 它都不会删除其临时目录 即 domains mydomain servers myserver tmp WL TEMP APP DOWNLOADS domains mydomain servers myserver tm
  • BigDecimal 的 JPA @Size 注释

    我该如何使用 SizeMySQL 的注释DECIMAL x y 列 我在用着BigDecimal 但是当我尝试包括 Size max它不起作用 这是我的代码 Size max 7 2 Column name weight private B
  • 通过 JNI 从 Applet 调用 DLL

    我有一个 概念验证 的作品 它跨越了一些不熟悉的领域 我的任务是将 EFTPOS 机器连接到在内联网浏览器中作为小程序运行的应用程序 我暂时忽略了 EFTPOS dll 并用我选择的语言 Delphi 创建了一个简单的 JNI 修饰的 DL
  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • 更改 JTextPane 的大小

    我是Java新手 刚刚在StackOverflow中找到了这段代码 ResizeTextArea https stackoverflow com questions 9370561 enabling scroll bars when jte
  • Hystrix是否可以订阅CircuitBreaker开启事件?

    对于单元测试 我希望能够订阅 Hystrix 事件 特别是在断路器打开或关闭时发生事件 我四处寻找示例 似乎解决方法是利用指标流并监视断路器标志 由于 Hystrix 是基于 RxJava 构建的 我认为应该在某个地方有一个事件订阅接口 在
  • 如何使用 Spring MVC 和 Thymeleaf 添加静态文件

    我的问题是如何添加 CSS 和图像文件等静态文件 以便我可以使用它们 我正在使用 Spring MVC 和 Thymeleaf 我查看了有关此主题的各种帖子 但它们对我没有帮助 所以我才来问 根据这些帖子 我将 CSS 和图像文件放在res
  • 如何在命令提示符中检查 JAVA_OPTS 值?

    我们的应用程序部署 JBoss 服务器然后抛出错误 PermGen space 然后在 jboss bat 和配置文件中设置 permgen 变量中的 java OPTS JAVA OPTs 中是否有值 assige 如何检查 如何在命令提
  • 如何将txt文件添加到你的android项目中? [复制]

    这个问题在这里已经有答案了 我的Android studio版本是1 5 1 显然这个 never 版本没有 txt 文件的 asset 文件夹 您打算如何将这些文件包含到您的项目中 以及如何进一步使用您内部的应用程序 谢谢你的建议 Pro
  • 尝试在空对象引用上调用虚拟方法“java.lang.String org.jsoup.nodes.Element.ownText()”

    我正在使用下面的代码来获取版本名称 from 应用商店通过使用 jsoup 我正在获取详细信息 但它引发了一些异常 我的代码是 public class ForceUpdateAsync extends AsyncTask
  • 膨胀类片段 InflateException 二进制 XML 文件时出错

    我正在使用 Material Design 和 NavigationDrawer 布局等设计我的第一个应用程序 但我遇到了一个问题 该应用程序非常简单 它只显示文本 并且基于 Android Studio 中提供的模板 尝试启动我的应用程序
  • Hibernate @OneToMany 注释到底是如何工作的?

    我对 Hibernate 还很陌生 我正在通过教程学习它 我在理解到底如何一对多注释作品 所以我有这两个实体类 Student代表一个学生并且Guide代表指导学生的人 因此 每个学生都与一名向导相关联 但一名向导可以跟随多个学生 我想要一
  • 无法仅在控制台中启动 androidstudio

    你好 我的问题是下一个 我下载了Android Studio如果我去 路径 android studio bin 我执行studio sh 我收到以下错误 No JDK found Please validate either STUDIO
  • java中wav文件转换为字节数组

    我的项目是 阿塞拜疆语音的语音识别 我必须编写一个程序来转换wav文件到字节数组 如何将音频文件转换为byte 基本上如第一个答案中的片段所描述 但不是BufferedInputStream use AudioSystem getAudio
  • 如何使用 SAX Java 解析器读取注释文本

    我只想使用 Java 中的 SAX 解析器读取 XML 文件中对象标记的注释 这是我的文件的摘要
  • 编译时在代码中替换Java静态最终值?

    在java中 假设我有以下内容 fileA java class A public static final int SIZE 100 然后在另一个文件中我使用这个值 fileB java import A class b Object t
  • java中的回调是什么[重复]

    这个问题在这里已经有答案了 可能的重复 什么是回调函数 https stackoverflow com questions 824234 what is a callback function 我已经阅读了回调的维基百科定义 但我仍然没有明

随机推荐

  • Unity排行榜功能(使用MVC框架)

    要求 实现如图所示UI界面 按下某一按键实现排行榜的更新 M 数据模型类 主要负责数据 玩家的数据 public class RankModel 定义三个属性 姓名 分数 排名 定义构造函数 public string Name set g
  • 基于arduino下的巡线小车

    先发代码再进行解释吧 include
  • 《Head First HTML5 javascript》第10章 自定义对象

    2022 11 23 第10章 自定义对象 面向对象OOP Object Oriented Programming 对象是一个包含相关数据和方法的集合 通常由一些变量和函数组成 我们称之为对象里面的属性和方法 对象是存储在单个分组中的相关功
  • Git统计个人提交代码行数

    1 Git统计个人提交代码行数 git log format aN sort u while read name do echo en name t git log author name pretty tformat numstat aw
  • Windows系统文件快捷链接(软链接/硬链接/符号链接)mklink

    记录学习mklink 将大文件从c盘移出 快捷方式 软链接 硬链接 符号链接 快捷方式 常见文件链接方式 在Windows上以 lnk结尾的文件 这类文件通常用于指定某一个文件或某一个目录的位置 可扩展性很强 桌面快捷方式就是这类了 软链接
  • Ubuntu Openvino(YOLOV5)加载训练好的模型 xml onnx bin

    使用 Openvino 对自己训练好的模型yolov5 pt gt IR 进行推理 环境需求 Ubuntu 系统 20 04 vscode 编辑器 python3 Openvino 环境 priority 关键为 export 导出的修改
  • Libvirt简介

    Libvirt 是一个函数库 包含实现Linux虚拟化功能的linux API 提供了管理虚拟机的稳定的 统一的接口 其主要包括Libvirt API Libvirtd进程和virsh工具集三个部分 架构说明 用户程序 程序 virsh工具
  • Flutter基础(手势检测GestureDetector)-二

    import package flutter material dart void main runApp new MaterialApp title flutter质感设计 home new MyButton class MyButton
  • 核工业物理研究院九院三所

    1 流体物理研究所 一所 高能量密度流体力学过程 爆轰压缩 凝聚态 辐射流体力学等 可以说包括了核武器设计的基础理论部分和核试验 亚临界试验等的试验数据采集分析 2 核物理与化学研究所 二所 核物理 放射化学 核过程等 就是核反应堆技术 核
  • mongo 常用的命令

    一个mongod服务可以有建立多个数据库 每个数据库可以有多张表 这里的表名叫collection 每个collection可以存放多个文档 document 每个文档都以BSON binary json 的形式存放于硬盘中 因此可以存储比
  • 虚拟网络无法连接本机网络(Xshell无法连接虚拟机)

    Xshell无法连接虚拟机 类似于 Could not connect to 192 168 0 128 port 22 Connection failed 在很多博客中也看到过许多解决方法 例如 安装sshd的客户端 服务端 给sshd的
  • 华为mate30老是显示无法连接服务器,华为Mate30 Pro手机微信信息老是发不出,提示无法连接到网络...

    华为Mate30 Pro手机的微信信息老是发不出 并且在接收微信消息的有延迟 信号满格 时常提示无法连接到网络 微信时常半天发不出 发个东西转半天 接收也经常延迟几分钟才收到提醒 这是什么鬼手机啊 别人发来消息 一来就是好多条 还有十来分钟
  • priorityQueue优先级队列 (python、c++)

    优先级队列 优先级队列 python C 最近用优先队列写了一个SNIC超像素分割的工程 有兴趣的可以下载看看 VIP大佬让我赚一点下载积分吧 感激不尽 https download csdn net download koffee f 1
  • 2023天一永安杯部分wp

    web Query 布尔盲注 import requests import string dictionary string digits string ascii letters url http cd5a2660b462c867 nod
  • linux 开启curl命令,如何启用curl命令HTTP2支持

    当我们直接使用 curl 去请求一个 https 页面时 默认可以看到其默认返回的是 HTTP1 1 的 response 现在使用 HTTP2 的网站越来越多 技术也越来越成熟 如何启用 curl 命令 HTTP 2 支持就成为了一个问题
  • 洛谷 B2043 判断能否被 3,5,7 整除 题解

    这一道题很简单 首先 要输入一个数x 之后将判断x分别是否能整除3 5 7 为了进行依次的判断 我们要使用for循环 for int i 3 i lt 7 i 2 i 3表示从3开始循环 之后i lt 7循环到7结束 由于整除的数为3 5
  • 安装tensorflow过程中的报错

    安装tensorflow后 测试安装是否成功 结果报错 SystemError
  • 数组对象与字符串对象

    1 数组对象 1 1什么是数组对象 javaScrip中的数组对象可以使用new Array或字面量 来创建 在创建以后 就可以调用数组对象提供的一些方法来实现对数组额度操作了 数组对象用于在单个变量中存储多个值 JavaScript的数组
  • RocketMQ学习笔记 - 顺序消息

    文章目录 1 定义 2 代码示例 2 1 消息实体 2 2 生产者 2 3 消费者 2 3 测试结果 1 定义 顺序消息 FIFO 消息 是 MQ 提供的一种严格按照顺序进行发布和消费的消息类型 顺序消息由两个部分组成 顺序发布和顺序消费
  • PowerMockito单元测试(1)-主要思想以及常规异常覆盖

    1 测试主要操作步骤 要测试的方法 Component public class UserDao Autowired private UserMapper userMapper Autowired private SystemErrorRe