好得很程序员自学网
  • 首页
  • 后端语言
    • C#
    • PHP
    • Python
    • java
    • Golang
    • ASP.NET
  • 前端开发
    • Angular
    • react框架
    • LayUi开发
    • javascript
    • HTML与HTML5
    • CSS与CSS3
    • jQuery
    • Bootstrap
    • NodeJS
    • Vue与小程序技术
    • Photoshop
  • 数据库技术
    • MSSQL
    • MYSQL
    • Redis
    • MongoDB
    • Oracle
    • PostgreSQL
    • Sqlite
    • 数据库基础
    • 数据库排错
  • CMS系统
    • HDHCMS
    • WordPress
    • Dedecms
    • PhpCms
    • 帝国CMS
    • ThinkPHP
    • Discuz
    • ZBlog
    • ECSHOP
  • 高手进阶
    • Android技术
    • 正则表达式
    • 数据结构与算法
  • 系统运维
    • Windows
    • apache
    • 服务器排错
    • 网站安全
    • nginx
    • linux系统
    • MacOS
  • 学习教程
    • 前端脚本教程
    • HTML与CSS 教程
    • 脚本语言教程
    • 数据库教程
    • 应用系统教程
  • 新技术
  • 编程导航
    • 区块链
    • IT资讯
    • 设计灵感
    • 建站资源
    • 开发团队
    • 程序社区
    • 图标图库
    • 图形动效
    • IDE环境
    • 在线工具
    • 调试测试
    • Node开发
    • 游戏框架
    • CSS库
    • Jquery插件
    • Js插件
    • Web框架
    • 移动端框架
    • 模块管理
    • 开发社区
    • 在线课堂
    • 框架类库
    • 项目托管
    • 云服务

当前位置:首页>CMS系统>Dedecms
<tfoot draggable='sEl'></tfoot>

phpmock静态方法 php静态方法和普通方法区别

很多站长朋友们都不太清楚phpmock静态方法,今天小编就来给大家整理phpmock静态方法,希望对各位有所帮助,具体内容如下:

本文目录一览: 1、 PHPUnit模拟对象的静态方法问题,怎么解决 2、 如何使用Powermock对静态方法进行mock 3、 如何mock静态方法 PHPUnit模拟对象的静态方法问题,怎么解决

当我们对A类进行单元测试时,A类可能依赖了B类,为了减少依赖,方便A类方法的测试,我们可以模拟一个B类,简单规定其各方法的返回值(而非真正实现具体逻辑)。Phpunit中提供了一套模拟类的api,简单使用如下:

[php] view

plaincopyprint?

class StubTest extends PHPUnit_Framework_TestCase

{

public function testStub()

{

// Create a stub for the SomeClass class.

$stub = $this->getMock('SomeClass');

// Configure the stub.

$stub->expects($this->any())

->method('doSomething')

->will($this->returnValue('foo'));

// Calling $stub->doSomething() will now return

// 'foo'.

$this->assertEquals('foo', $stub->doSomething());

}

}

class StubTest extends PHPUnit_Framework_TestCase

{

public function testStub()

{

// Create a stub for the SomeClass class.

$stub = $this->getMock('SomeClass');

// Configure the stub.

$stub->expects($this->any())

->method('doSomething')

->will($this->returnValue('foo'));

// Calling $stub->doSomething() will now return

// 'foo'.

$this->assertEquals('foo', $stub->doSomething());

}

}

在这个例子中,我们得到了一个'SomeClass'的模拟,规定其可以被调用任意次,如果调用doSomething方法,将得到值foo。

问题:

我们知道,对于一个单例类,其constructor方法为private,而getMock的实现,默认是要调用原类的constructor方法。

如果SomeClass为单例,phpunit将会提示

Call to private SomeClass::__construct() from context 'PHPUnit_Framework_TestCase'

这时,我们的测试该如何进行呢?

解决:

仍然使用getMock进行模拟。

只要将其第5个参数设为false即可。其含意是:不调用原对象的构造函数。

[php] view

plaincopyprint?

$stub = $this->getMock('SomeClass', array(), array(), '', false);

$stub = $this->getMock('SomeClass', array(), array(), '', false);

不得不说,这样使用有点复杂。

如果你使用的是phpunit3.5及以上版本提供了更易用的api,你可以这样禁掉对原有constructor方法的调用。

$stub=$this->getMockBuilder('SomeClass')->disableOriginalConstructor()->getMock();

附:

对getMock的6个可选参数的详解,

手册中并未提及它们的默认值,经测试得到结果如下:

array(), array(), '', false, false, false

即

$stub=$this->getMockBuilder('SomeClass')

等同于:

$stub=$this->getMockBuilder('SomeClass',array(), array(), '', true, false, false)

如何使用Powermock对静态方法进行mock

  在平常工作过程中,总会设计些工具类,里面通常使用静态方法来实现。那么如何来对这些静态方法进行mock,以及如何验证静态方法被调用?下面简单介绍下如何使用Powermock来实现针对静态方法的mock。

  首先我们设计一个静态类如下(Utility.java):

  被测试类如下(UtilityHelper.java):

  在被测试类中分别定义了两个方法,分别调用了Utility类里面的两个静态方法,下面我们通过对这两个方法进行测试,来介绍下使用Powermock对静态方法进行mock的各种用法。

  测试类如下(UtilityHelperTest.java):

可以看到虽然入参非空,但是由于返回值返回了true,使得调用sum方法返回的值是0。

  另外,如果我们想要验证某静态方法是否被调用,或者被调用了几次,我们可以用如下方式验证:

  先使用verifyStatic方法表明要验证静态方法,可以带参数,也可以不带参数,其参数可以使用Mockito的times方法或never方法来表示其调用次数。下面紧跟着的一行则表示要验证的是哪个已经mock的静态方法。

  那么如果我们想对已经mock的类的某个方法调用真实的方法,而不是调用mock方法,那么该如何处理呢?此处我们介绍两种实现:

  加了上面一行后,虽然也没有对listIsNotNullOrEmpty进行mock,但此时返回值是真正的值,说明没有调用默认的mock方法。使用spy后,虽然已经对该类做了mockStatic处理,但此时该类中的所有方法仍然都会调用真实的方法,而不是默认的mock方法。这种用法主要适用于只想要对某个类的少量方法进行mock,其他方法仍然执行真正的方法,平常写时,可以紧跟在mockStatic方法后。

  此行的含义就是调用到mock类的该方法执行真正的方法,而不是mock方法。这种方式就是需要对每个要执行的方法都要进行相应的mock处理。

  上述两种方式,可以根据自己的需要进行选择使用哪一种。但是一定要记得,只要使用了mockStatic某类时,该类中的所有方法就已经都默认被mock了, 在调用该类的方法时,必须根据具体方法进行相应的处理。

  另外,重要的事说三遍: 如果要mock静态方法,必须要在PrepareForTest后面加上该方法所在的类 。

如何mock静态方法

因为Mockito使用继承的方式实现mock的,用CGLIB生成mock对象代替真实的对象进行执行,为了mock实例的方法,你可以在subclass中覆盖它,而static方法是不能被子类覆盖的,所以Mockito不能mock静态方法。

但PowerMock可以mock静态方法,因为它直接在bytecode上工作,类似这样:

import org.powermock.api.mockito.PowerMockito;

import org.powermock.core.classloader.annotations.PrepareForTest;

import org.powermock.modules.testng.PowerMockTestCase;

import org.testng.Assert;

import org.testng.annotations.Test;

@PrepareForTest(AbstractAnimal.class)

public class AbstractAnimalTest extends PowerMockTestCase {

关于phpmock静态方法的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。

查看更多关于phpmock静态方法 php静态方法和普通方法区别的详细内容...

声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did167783
更新时间:2023-03-31   阅读:41次

上一篇: php联动下拉菜单 php下拉框联动

下一篇:php做蜜罐系统 蜜罐技术的配置模式

相关资讯

最新资料更新

  • 1.dedecms5.7商城系统游客可下订单购买的修改方法
  • 2.dedecms首页调用专题页描述和链接的实现方法
  • 3.dedecms 调用单页栏目内容到首页的方法
  • 4.dedecms安装运行详细图文教程
  • 5.DedeCms开启多站点支持绝对网址后生成RSS错误的修改方法
  • 6.织梦dedecms会员注册邮件验证设置方法
  • 7.DEDECMS内容页分页过多、过长问题最佳解决方案
  • 8.dedecms 的cn_substr_utf8字符串截取函数商榷
  • 9.加快织梦dedeCMS内容生成速度方法
  • 10.织梦dedecms数据库类$dsql使用方法步骤
  • 11.织梦Dedecms设置伪静态详细方法
  • 12.DEDE热门tag,DEDE首页digg,DEDE随机热门关键字调用方法
  • 13.dedecms文章keywords关键词字数限制修改方法(同适用于描述)
  • 14.增加dedecms后台留言管理功能
  • 15.详解织梦DEDECMS站点内容自动更新到新浪微博的方法
  • 16.dedecms重新定义cn_substr函数截取字数更准确
  • 17.dedecms导航判断当前选中样式的方法
  • 18.dede中统计栏目文章数的2种实现方法
  • 19.解决织梦安装模板时提示不能安装的问题
  • 20.DEDECMS JSON数据生成 DEDECMS JSON接口制作

CopyRight:2016-2025好得很程序员自学网 备案ICP:湘ICP备09009000号-16 http://haodehen.cn
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网」
[ SiteMap ]