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模拟对象

powermock模拟对象_使用PowerMock模拟构造函数相关推荐

  1. powermock模拟对象_使用PowerMock测试对象的内部状态

    powermock模拟对象 大多数单元测试都集中于测试对象的行为以证明其有效. 这可以通过编写一个JUnit测试来实现,该测试调用对象的公共方法,然后测试这些调用的返回值是否与先前定义的一组期望值匹配 ...

  2. powermock私有字段_使用PowerMock的EasyMock私有方法模拟

    powermock私有字段 Sometimes we want to test a method that is using a private method. We can create the m ...

  3. java如何模拟请求_单元测试如何模拟用户请求

    python web自动化测试设计构工具书 40.9元 包邮 (需用券) 去购买 > 错误 正当我高高兴兴写完后台c层的测试代码准备提交时,测试机器人报了很多401错误,把代码拉下来一看,原来当 ...

  4. pythoncookie自动模拟登录_用Python模拟技巧带你实现自动抽屉登录自动点赞

    原标题:用Python模拟技巧带你实现自动抽屉登录&自动点赞 /1 前言/ 嘿,各位小伙伴们晚上好呀,今天小编又给大家带来干货内容啦,今天带来的是,如何自动登录抽屉,并且点赞! 原计划是不打算 ...

  5. scapy模拟攻击_用scapy模拟DNS放大攻击

    首先,DNS放大攻击,简单解释有两点: 1.伪造源IP为其他人的ip地址 2.被请求的记录,要求比较大,比如TXT格式,4000KB 在A机器上,向DNS发送查询那个TXT的记录,并伪造成别人的ip, ...

  6. java模拟时间_使用生成器模拟时间分片

    对于cpu密集型任务, 时间分片可以有效减少页面卡顿, 不过对于纯计算型任务还是推荐使用worker在后台做计算 效果图, 计算密集型任务被分到每次只执行16ms, 每次执行完毕留给浏览器时间去响应事 ...

  7. python3 模拟浏览器_关于python模拟浏览器行为

    import requests from bs4 import BeautifulSoup import time import json from selenium import webdriver ...

  8. java微博模拟登陆_用httpclient模拟浏览器,登录新浪微博

    ①用Fiddler2追踪登录时的post请求,发现需要以下参数: check uname backURL autoLogin pwd 其中,backURL="/",check=&q ...

  9. 让数组的左边全为奇数C语言,2015年全国计算机等级考试全真模拟考场_二级C语言试卷四.docx...

    2015年全国计算机等级考试全真模拟考场_二级C语言试卷四 全国计算机等级考试全真模拟试卷(4) 二级C (考试时间l20分钟,满分100分) 一.选择题(每小题1分,共40分) (1)算法是指( ) ...

最新文章

  1. 利用jquery.form.js实现Ajax无刷新图片上传及预览功能
  2. 【PC工具】大神级代码注释,漂亮实用的代码注释工具代码logo工具
  3. pyrealsense2 sensor.get_supported_options()(获取当前sensor支持的参数)
  4. CH0103最短Hamilton路径 poj2288 Islands and Brigdes【状压DP】
  5. python语言input和if else的嵌套使用_Linux平台下Python if、if..else、if..elif..else、嵌套if语句...
  6. TreeView控件的展开与折叠
  7. POJ - 3470 Walls
  8. java考前复习之String 类
  9. 什么是预热 压测_全链路压测探索实践之路
  10. 记一次生产环境存储过程优化的过程(42秒--0.06秒)
  11. pycharm:There is not enough memory to perform the requested operation
  12. 循环神经(LSTM)网络学习总结
  13. 怎么看接收灵敏度desense问题?
  14. Shader+UGUI仿制Unity拾色器
  15. 爱莫完成A+轮融资,打造基于实体零售数据引擎的Metachain Store平台
  16. [小o地图-数据] - 城市交通态势数据(实时路况)
  17. Win10添加右键打开cmd和Powershell窗口(管理员/非管理员)
  18. 春季瘦身燃烧脂肪14种妙法
  19. ChatGPT 辅助专利写作
  20. html怎么电视连电脑,电脑怎么投屏到电视?图文讲解电脑投屏具体方法步骤

热门文章

  1. Spring MVC常用注解,你会几个?
  2. spring boot使用注解的方式整合mybaits
  3. 【JDBC】各版本jar包下载网址及Tomcat下载
  4. Feign数据压缩传输
  5. Ajax判断用户名是否可用
  6. 让浏览器认为现在处于登录状态
  7. 2019蓝桥杯省赛---java---B---6(特别数的和)
  8. 获取笔记本的SHA1的值。
  9. php中对象的遍历输出,PHP中的对象遍历技巧
  10. python简单爬虫课题_VS2019python爬虫入门