使用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())。Return(expected);相关。

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

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

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


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

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

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

相关文章

Brackets (区间DP)

个人心得:今天就做了这些区间DP,这一题开始想用最长子序列那些套路的,后面发现不满足无后效性的问题,即(,)的配对 对结果有一定的影响,后面想着就用上一题的思想就慢慢的从小一步一步…

android生成aar无效,android studio生成aar包并在其他工程引用aar包的方法

1.aar包是android studio下打包android工程中src、res、lib后生成的aar文件,aar包导入其他android studio 工程后,其他工程可以方便引用源码和资源文件2.生成aar包步骤:①.用android studio打开一个工程,然后新建一个Module&#…

《剑指offer》— JavaScript(3)从尾到头打印链表

从尾到头打印链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值。 实现代码 /*function ListNode(x){this.val x;this.next null; }*/ function printListFromTailToHead(head) {var res[];while(head){res.unshift(head.val);headhead.next;}return res;…

JUnit测试Spring Service和DAO(带有内存数据库)

这篇文章描述了如何为Spring Web Application的Services和DAO实现JUnit测试。 它建立在Spring MVC-Service-DAO-Persistence Architecture Example的基础上 。 从Github的Spring-Web-JPA-Testing目录中可以找到该示例。 提醒 测试装置 –固定状态,用作运行测试的基…

c# 正则获取html标签内容,c# – 使用正则表达式在多个HTML标记之间获取文本

使用正则表达式,我希望能够在多个DIV标记之间获取文本.例如,以下内容:first html taganother tag输出:first html taganother tag我使用的正则表达式模式只匹配我的最后一个div标签并错过了第一个.码:static void Main(string[] args){string…

Android之外部存储(SD卡)

*手机的外部存储空间,这个我们可以理解成电脑的外接移动硬盘,U盘也行。所有的Android设备都有两个文件存储区域:“内部”和“外部”存储器。这两个名称来自早期的Android,当时大多数设备都提供内置的固定的内存(内置存…

通用并发对象池

在本文中,我们将介绍如何在Java中创建对象池。 近年来,JVM的性能成倍增加,大多数类型的对象几乎都变得多余,从而提高了对象池的性能。 从本质上讲,对象的创建不再像以前那样昂贵。 但是,有些对象在创建时肯…

圆周率的代码表示,以及对其的理解。

转载的简书,for 记录以及记忆。 http://www.jianshu.com/p/7208e4a58310 Thanks again! 转载于:https://www.cnblogs.com/xiapeng0701/p/7538281.html

华为NOVa8Pr0是用鸿蒙系统吗,华为Nova8即将发布,采用麒麟芯片,高端平板适配鸿蒙系统...

大家好,我是老孙自从华为Mate40系列发布后,下一步新机动态备受外界关注,华为究竟会不会继续生产手机呢?答案是肯定,华为Nova8系列将于本月发布,华为P50系列也在积极筹备,而且都少不了麒麟芯片&a…

使用路标的Scala和Java的Twitter REST API

如果您已阅读此博客上的其他文章,您可能会知道我喜欢创建各种数据集的可视化。 我刚刚开始一个小项目,在这里我想可视化来自Twitter的一些数据。 为此,我想直接从Twitter检索有关关注者的信息和个人资料信息。 我实际上开始寻找一组所有推特帐…

大话设计模式读书笔记--11.抽象工厂模式

定义 抽象工厂模式定义: 提供一个创建一系列相关或相关依赖对象的接口,而无需指定他们具体的类 抽象工厂模式通常是用于创建一族产品,并且这族产品分不同的等级;不同的具体工厂类生产不同等级的一族产品 比如下图(来源于网络) 两厢车和三厢车称为两个不同…

在线压缩html,JS代码压缩 - javascript代码压缩 - jsmin在线js压缩工具

输入代码:// is.js// (c) 2001 Douglas Crockford// 2001 June 3// The -is- object is used to identify the browser. Every browser edition// identifies itself, but there is no standard way of doing it, and some of// the identification is deceptive. T…

Primefaces dataTable设置某个cell的样式问题

设置primefaces dataTable的源网段列的Cell可以编辑,当回车键保存时,判断是否输入的网段合法,如果不合法就显示警告信息,并将这个不合法的数据用红色表示。问题是,怎么给这一个cell设定样式。通过给标签设定ID然后在后…

鸭子在Java中打字? 好吧,不完全是

根据维基百科,鸭子的打字是: 动态类型的类型,其中对象的方法和属性确定有效的语义,而不是其从特定类或特定接口的实现继承 用简单的话 当我看到一只鸟走路像鸭子,游泳像鸭子,嘎嘎像鸭子一样时&#xff0c…

前端学习路线

第一部分 HTML 第一章 职业规划和前景 职业方向规划定位: web前端开发工程师 web网站架构师 自己创业 转岗管理或其他 web前端开发的前景展望: 未来IT行业企业需求最多的人才 结合最新的html5抢占移动端的市场 自己创业做老板 随着互联网的普及we…

p1164【立方体求和】

题目: SubRaY有一天得到一块西瓜,是长方体形的....SubRaY发现这块西瓜长m厘米,宽n厘米,高h厘米.他发现如果把这块西瓜平均地分成m*n*h块1立方厘米的小正方体,那么每一小块都会有一个营养值(可能为负,因为西瓜是有可能坏掉的,但是绝对值不超过200).现在SubRaY决定从这…

html生成自定义表格,自定义js的表格插件

场景:指定元素,生成自定义表格。目的:了解js的插件开发。html代码:自定义表格插件var test new MyTable({elid:"mytable",//定义哪个div要生成表单thead:{//指定列名name:"姓名",age:"年龄",addr:…

使用JBehave,Gradle和Jenkins的行为驱动开发(BDD)

行为驱动开发 (BDD)是一个协作过程 ,产品负责人,开发人员和测试人员可以合作交付可为企业带来价值的软件。 BDD是 测试驱动开发 (TDD) 的合理下一步 。 行为驱动的发展 本质上,BDD是一种交付…

手型显示html,css各种手型集合(css禁止手型)

html>css各种手型集合(css禁止手型).auto { cursor: auto; }.deafult { cursor: default; }.none { cursor: none; }.context-menu { cursor: context-menu; }.help { cursor: help; }.pointer { cursor: pointer; }.p…

Maven Fluido Skin和Javadoc类图

我使用Maven网站已有一段时间了,对此我感到非常满意。 我不想在Maven 3之后更新我的项目,但是没关系,Maven 3带来了许多新奇的东西。 但是,有两件事使我感到烦恼:缺乏美观和现代的外观,以及浏览复杂代码的J…