前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何对类中的private方法进行测试?

如何对类中的private方法进行测试?

作者头像
跑马溜溜的球
发布于 2020-12-07 07:29:39
发布于 2020-12-07 07:29:39
3.5K00
代码可运行
举报
文章被收录于专栏:日积月累1024日积月累1024
运行总次数:0
代码可运行

问题:如何对类中的private方法进行测试? 大多数时候,private都是给public方法调用的,其实只要测试public即可。但是有时由于逻辑复杂等原因,一个public方法可能包含了多个private方法,再加上各种if/else,直接测public又要覆盖其中每个private方法的N多情况还是比较麻烦的,这时候应该考虑单对其中的private方法时行测试了。那么如何进行呢?

思路: 通过反射机制,在testcase中将私有方法设为“可访问”,从而实现对私有方法的测试。 假设我们要对下面这个类的sub方法进行测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Demo{
                private function sub($a, $b){
                return $a - $b;
        }
}

测试类如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DemoTest extends PHPUnit_Framework_TestCase{                                 
    public function testAdd(){                                                     
        $d = new Demo();
        //取sub方法                                                            
        $method = new ReflectionMethod('Demo', 'sub');  
       //设为可访问                                 
        $method->setAccessible(true);     
        $a = 1;                                                                    
        $b = 2;                                                                    
        $res = $method->invoke($d, $a, $b);  //调用                                                                                       
        $this->assertEquals(-1, $res);                                             
    }                                   
}          

好了,现在你可以顺利的测试private方法了。 对于Protected方法也可以用这种方法测试,但个人更推荐使用继承的思路去测(详见http://blog.csdn.net/qmhball/article/details/7462175) 注意:因为setAccessible方法,只在php5.3.2以上的版本才有,所以此方法有一定局限性。这也是为什么对protected方法更建议用继承的思路去测。

附: 测试类改写为下面这种方式,个人感觉更清晰。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//改写一个sub方法,与Demo类相同,只是将其变成public
class DemoForTest extends Demo{
    public function sub($a, $b){
        $d = new Demo();
        $method = new ReflectionMethod('Demo', 'sub');
        $method->setAccessible(true);
        return $method->invoke($d, $a, $b);
    }
}

class DemoTest extends PHPUnit_Framework_TestCase{
        public function testSub(){
              //测试DemoForTest的sub方法与测试Demo的sub方法是一样的
                $obj = new DemoForTest();
              $res = $obj->sub(1, 2);
              $this->assertEquals(-1, $res);
        }

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012/04/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
自动化测试:六个值得参考的 Laravel 开源项目
顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscript,
顾翔
2019/12/12
2K0
自动化测试:六个值得参考的 Laravel 开源项目
写Laravel测试代码(4)
在写单元测试时,有时候需要测试A class 的 protected or private method,可以使用 Class Reflection 来做,而不是去改成public,破坏封装。
botkenni
2019/09/02
5980
Laravel 单元测试:使用phpunit进行测试
文章链接:https://cloud.tencent.com/developer/article/2468863
程序那些事儿
2024/11/21
1210
Laravel 单元测试:使用phpunit进行测试
单元测试套件PHPUnit_Framework_TestSuite的用法
二.TestSuite的两种用法 在写用法之前,先做点准备工作。 demo.php
跑马溜溜的球
2020/12/07
6440
PHPUnit入门基础教程
PHPUnit是PHP语言的单元测试框架、工具,xunit单元测试工具系列成员之一,可以单独运行在Linux或windows系统下面,也可以集成到zend studio等IDE工具中。
星哥玩云
2022/07/11
1.6K0
PHPUnit入门基础教程
Laravel 中简约而不简单的 Macroable 宏指令
很简单的代码,根据参数的注释,$macro可以传一个闭包或者对象,之所以可以传对象,多亏了PHP中的魔术方法
seth-shi
2023/12/18
2850
Laravel 中简约而不简单的 Macroable 宏指令
Laravel5.3之PHP反射(Reflection) (上)
说明:Laravel中经常使用PHP的反射特性来设计代码,本文主要学习PHP的反射特性,来提高写代码时的设计质量。PHP提供一套检测class, interface, trait, property, method的两个工具包:Introspection Functions和Reflection API,类似于探针一样的东西来探测这些一等公民。本文先看下Introspection Functions的使用。
botkenni
2022/01/10
2.1K0
Laravel5.3之PHP反射(Reflection) (上)
如何对类中的protected方法进行单元测试
也许很多同学写单元测试时遇到这样的问题,一个类方法是 protected ,如何测呢 ? 当然,你可以说把 protected 改成 public 就可测了!没错,是可测了,可是 ......
跑马溜溜的球
2020/12/07
4K0
【译】现代化的PHP开发--TDD
来源/https://www.startutorial.com/articles/view/modern-php-developer-tdd 译/Lemon黄
Lemon黄
2019/10/29
1K0
PHPUnit 单元测试都不会的 PHPer 没法写出高质量的代码
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
猿哥
2019/11/11
1.2K0
如何在phpunit中mock一个单例类
Mock简介 当我们对A类进行单元测试时,A类可能依赖了B类,为了减少依赖,方便A类方法的测试,我们可以模拟一个B类,简单规定其各方法的返回值(而非真正实现具体逻辑)。 Phpunit中提供了一套模拟类的api,简单使用如下:
跑马溜溜的球
2020/12/07
1.8K0
阿里开源新一代单元测试 Mock 工具!
TestableMock是基于源码和字节码增强的Java单元测试辅助工具,包含以下功能:
肉眼品世界
2021/01/06
1.1K0
Laravel之Pipeline1. 背景2. 基本操作3. 动手实现4. Laravel中Pipeline实现5. 总结
在Laravel中经常需要对一个对象,经过多个中间层处理后,才到真正处理的函数,Laravel将这种常用操作抽象出来,叫做Pipeline
zhuanxu
2018/08/23
4520
Laravel之Pipeline1. 背景2. 基本操作3. 动手实现4. Laravel中Pipeline实现5. 总结
PHP反射类,ReflectionClass、ReflectionMethod的使用
本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/46
joshua317
2021/08/31
1.9K0
通过JUnit5访问Java静态、私有、保护变量和方法
在《通过Gtest访问C++静态、私有、保护变量和方法》一文中介绍了如何通过Gtest访问C++静态、私有、保护变量和方法,本文介绍如何通过Junit5访问Java静态、私有、保护变量和方法。
顾翔
2024/09/10
1720
通过JUnit5访问Java静态、私有、保护变量和方法
学了那么久的 Java基础,该试着进阶了【测试,反射,注解】
黑盒测试就如上图一样,像一个黑色的盒子,测试人员在测试时无需关注代码内部的实现逻辑,只需要向黑盒中输入一个值,观察输出的值是否符合预期输出结果的情况。
繁依Fanyi
2023/05/07
2800
学了那么久的 Java基础,该试着进阶了【测试,反射,注解】
PHP 面向对象篇:继承、封装与多态
上篇教程学院君给大家介绍了 PHP 面向对象编程中的基本概念 —— 类与对象,今天我们在此基础上来看看面向对象的三大特性:继承、封装与多态。
学院君
2020/07/13
1.2K0
doctrine缘来 之 造轮子
本系列是读php data persistence with doctrine2 orm的笔记,本文是第一篇:自己造轮子。
zhuanxu
2018/08/23
5220
doctrine缘来 之 造轮子
开始使用PHPUnit
想试一下单元测试很久了,但是一直没有合适的项目,而且中文网络上的PHPUnit教程要么太旧,要么太乱,所以总也没学会。最近准备把手头的项目重构一下,决定开始使用PHPUnit做单元测试,先照着PHPUnit的官网做了一下Tutorial,虽然已经很简单了,仍然被卡住几次,所以写篇文章记录一下。因为对PHP的包管理系统不熟悉,这篇文章会从安装开始。
wangxl
2018/07/27
1.3K0
相关推荐
自动化测试:六个值得参考的 Laravel 开源项目
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文