powermock模拟对象_使用PowerMock模拟构造函数

powermock模拟对象

在我看来,依赖注入的主要好处之一是可以将模拟和/或存根对象注入代码中,以提高可测试性,增加测试覆盖率并编写更好,更有意义的测试。 但是,有时候您会遇到一些不使用依赖注入的传统代码,而是通过组合而不是聚合将它们结合在一起。

发生这种情况时,您有三种选择:

  1. 忽略该问题,不编写任何测试。
  2. 疯狂地进行重构,更改所有内容以使用依赖项注入。
  3. 使用PowerMock模拟构造函数

显然,选项1不是一个严肃的选项,尽管我建议重构以将所有内容移至依赖项注入,但这需要时间,而且您必须务实。 这就是PowerMock的用处。此博客演示了如何使用PowerMock模拟构造函数,这意味着当您的代码调用new时,它不会创建真实的对象,而是会创建模拟对象。

为了证明这个想法,我们首先需要测试一些类,如下所示。

public class AnyOldClass {public String someMethod() {return "someMethod";}}
public class UsesNewToInstantiateClass {public String createThing() {AnyOldClass myclass = new AnyOldClass();String returnValue = myclass.someMethod();return returnValue;}}

第一类是AnyOldClass,是代码通过调用new实例化的类。 在这个例子中,顾名思义,它可以是任何东西。

第二个类恰当地命名为UsesNewToInstantiateClass,它具有一个方法createThing(),在调用该方法时会执行以下操作:

AnyOldClass myclass = new AnyOldClass();

这一切都非常简单,因此我们将快速进行PowerMock辅助的JUnit测试:

import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import static org.powermock.api.easymock.PowerMock.expectNew;
import static org.powermock.api.easymock.PowerMock.replay;
import static org.powermock.api.easymock.PowerMock.verify;import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.annotation.Mock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;@RunWith(PowerMockRunner.class)
@PrepareForTest(UsesNewToInstantiateClass.class)
public class MockConstructorTest {@Mockprivate AnyOldClass anyClass;private UsesNewToInstantiateClass instance;@Testpublic final void testMockConstructor() throws Exception {instance = new UsesNewToInstantiateClass();expectNew(AnyOldClass.class).andReturn(anyClass);final String expected = "MY_OTHER_RESULT";expect(anyClass.someMethod()).andReturn(expected);replay(AnyOldClass.class, anyClass);String result = instance.createThing();verify(AnyOldClass.class, anyClass);assertEquals(expected, result);}}

首先,该类具有通常的PowerMock附加功能:

@RunWith(PowerMockRunner.class)
@PrepareForTest(UsesNewToInstantiateClass.class)

在文件的顶部加上anyOldClass模拟对象的创建。 要考虑的重要代码行是:

expectNew(AnyOldClass.class).andReturn(anyClass);

这行代码告诉PowerMock期望调用新的AnyOldClass()并返回我们的anyClass模拟对象。

同样有趣的是重播和验证的调用。 在上面的示例中,它们都有两个参数。 第一个,AnyOldClass.class与上面的ExpectNew(…)调用有关,而第二个,anyClass则与简单的模拟调用Expect(anyClass.someMethod())。andReturn(expected);相关。

在某些时候,您确实应该让new来做它所做的事情:创建一个请求类型的新对象。 有一种观点认为,在测试时您可能过度隔离代码,而对所有内容进行模拟会降低测试的含义和价值。 对我来说,没有正确的答案,这是一个选择的问题。

显而易见,如果您的代码访问诸如数据库之类的外部资源,那么您将重构并实现DI或使用PowerMock。 如果您的被测试代码不访问任何外部资源,那么更多的是判断多少代码隔离过多? 这也许需要一些思考,并且可能是另一天另一个博客的主题……

参考: 使用PowerMock从我们的JCG合作伙伴 Roger Hughes 嘲笑 “ Captain Debug's”博客中的 构造方法 。


翻译自: https://www.javacodegeeks.com/2012/09/using-powermock-to-mock-constructors.html

powermock模拟对象

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

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

相关文章

宝塔 没有找到站点_宝塔面板正确开启TLS 1.3并删除TLS 1.1

昨天折腾了一个AlphaSSL泛域名证书后,心血来潮去SSL评分网站测试了一番,最后的结果竟然是B,这真是不能忍啊……为啥会是B,查看了原因,竟然是启用了TLS 1.1,所以为B。那么,删除TLS 1.1不就可以了…

线程同步机制:互斥量、信号量、读写锁、条件变量

一、互斥量(mutex) 互斥量本质上是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。 对互斥量进行加锁以后,任何其它试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放…

在Cloudfoundry上部署RESTful服务

在本文中,我们将使用Pivotal Cloud Foundry(PCF)Dev在Cloudfoundry上部署RESTful服务。 由于创建静态Web服务不是本文的一部分,因此我已经创建了employee-service ,它具有静态后端,可从GitHub进行克隆。 在…

mysql 全连接查询合并字段

1、创建两张表 t1如下: idname1a13a3 t2如下: idname1b12b25b5 联合查询合并字段: sql语句: SELECT t3.name AS B, t3.name1 AS C ,COALESCE(t3.id2,t3.id1) AS myId FROM (SELECT t1.id as id2 ,t1.name as name,t2.id as id…

小米刷第三方recovery_小米平板4/Plus LTE版本开启电话功能

众所周知,因为入网许可或通信基带使用权限的问题,小米平板4/plus LTE版本通过系统的方式阉割了通话功能,不过硬件完全是支持的,所有还是有办法让你的平板可以像手机一样,可以通话,可以发送短信。过Magisk刷…

最佳线程数总结(1

最佳线程数: 性能压测的情况下,起初随着用户数的增加,QPS会上升,当到了一定的阀值之后,用户数量增加QPS并不会增加,或者增加不明显,同时请求的响应时间却大幅增加。这个阀值我们认为是最佳线程数。 为什么要…

MongoDB和Java(5):Spring Data整合MongoDB(注解配置)

最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装、客户端操作、安全认证、副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很大。特此记录,以备查看。 文章目…

新浪微博爬虫设计(Python版)

最近手头上有一个项目,是关于新浪微博的,其中有一环要做新浪微博的爬虫。虽然之前把《Python学习手册》和《Python核心编程》都囫囵吞栆地通读完了,不过真正到做项目的时候还是什么都不会。于是在网上找了大量的资料。关于获取新浪微博的内容…

python 返回空格_Python面试之 is 和 == 的区别

Python爬虫人工智能学习教程​www.python88.cn面试实习生的时候,当问到 is 和 的区别时,很多同学都答不上来,搞不清两者什么时候返回一致,什么时候返回不一致。本文我们来看一下这两者的区别。我们先来看几个例子:a …

【数据库设计和SQL基础语法】--索引和优化--SQL语句性能调优

一、SQL语句性能调优的基本原则 1.1 确定性能指标 响应时间 SQL语句性能调优的基本原则之一是确定性能指标,而其中最为关键的指标之一就是响应时间。响应时间是衡量数据库系统性能的重要指标,它表示从用户发送一个查询请求到接收到查询结果所经过的时间…

boke练习: spring boot: security post数据时,要么关闭crst,要么添加隐藏域

spring boot: security post数据时&#xff0c;要么关闭crst,要么添加隐藏域 http.csrf().disable();或者&#xff1a; <input name"${_csrf.parameterName}" type"hidden" value"${_csrf.token}">转载于:https://www.cnblogs.com/achengm…

法线有接缝_发送带有接缝的活动邀请

法线有接缝这些天来&#xff0c;我的一位同事在使用带有接缝&#xff08;版本2.x&#xff09;的邮件模板发送事件邀请时遇到了问题。 从根本上讲&#xff0c;这应该不是一项艰巨的任务&#xff0c;因此我将简要说明使用接缝邮件模板发送事件邀请需要做些什么。 发送邮件邀请时&…

LINUX任务(jobs)详解

转自 &#xff1a; http://hi.baidu.com/daweilang/item/58db8d308e54f6d56d15e999LINUX任务(jobs)详解 在用管理员执行一个命令后&#xff0c;用CtrlZ把命令转移到了后台。导致无法退出root的。 输入命令&#xff1a;exit 终端显示&#xff1a;There are stopped jobs. 解决方…

网页爬虫的设计与实现(Java版)

最近为了练手而且对网页爬虫也挺感兴趣&#xff0c;决定自己写一个网页爬虫程序。首先看看爬虫都应该有哪些功能。内容来自&#xff08;http://www.ibm.com/developerworks/cn/java/j-lo-dyse1/index.html?cadrs-&#xff09;网页收集的过程如同图的遍历&#xff0c;其中网页就…

springboot entity date_SpringBoot+JWT实战(附源码)

SpringBoot集成JWT首先我们搭建好SpringBoot框架&#xff0c;SpringBoot环境准备就绪。接下来执行以下操作&#xff1a;1.引入依赖引入JWT依赖,由于是基于Java&#xff0c;所以需要的是java-jwt。<dependency><groupId>com.auth0</groupId><artifactId>…

六、springboot(三)配置双数据源

1、目录结构 2.jdbc.properties配置 #db hougespring.datasource.houge.jdbc-urljdbc:oracle:thin:192.168.0.120:1521:ORCLspring.datasource.houge.usernamehougespring.datasource.houge.passwordmonkeyspring.datasource.houge.driver-class-nameoracle.jdbc.driver.Oracle…

在您的构建过程中添加微基准测试

介绍 作为一个行业&#xff0c;我们正在采用更高的透明度和更可预测的构建过程&#xff0c;以减少构建软件的风险。 持续交付的核心原则之一是通过反馈循环收集反馈。 在Dev9中 &#xff0c;我们采用了与CD原则相一致的“ 先知道 ”原则&#xff0c;这意味着我们&#xff08;开…

【C/C++】Linux下使用system()函数一定要谨慎

曾经的曾经&#xff0c;被system()函数折磨过&#xff0c;之所以这样&#xff0c;是因为对system()函数了解不够深入。只是简单的知道用这个函数执行一个系统命令&#xff0c;这远远不够&#xff0c;它的返回值、它所执行命令的返回值以及命令执行失败原因如何定位&#xff0c;…

定时器和多线程的不同

最近在做项目的时候&#xff0c;遇到了视频采集图像时。使用定时器与或使用多线程有些纠结。原先用了定时器测试了&#xff0c;因为项目需要占用较多的cpu&#xff0c;所以很明显图像显示比较卡。 所以网上查了下。贴出来大家学习学习。 软件定时器和多线程在控制工程中有着非…

华为s8600手机驱动_只有手机才能快充?华为MateBook X的灵巧快充解放你的续航焦虑-华为 ——快科技(驱动之家旗下媒体)-...

充电&#xff0c;永远是数码科技圈必不可少的话题。然而&#xff0c;想要好好给设备充电太并不容易。每次外出&#xff0c;为了防止手机没电&#xff0c;大家的兜里必然要揣着一个大容量的充电宝才安心&#xff0c;这也是手机快充最初诞生的原因。快充技术指的是通过技术手段&a…