欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

phpunit单测中调用private方法处理

程序员文章站 2022-05-05 22:32:56
...

问题背景:单测中有个普遍性的问题,被侧类中的private方法无法直接调用。小拽在处理过程中通过反射改变方法权限,进行单测,分享一下,直接上代码。

简单被测试类

生成一个简单的被测试类,只有个private方法。

单测代码

require_once ('./MyClass.php');

class MyClassTest extends PHPUnit_Framework_TestCase {
    const CLASS_NAME = 'MyClass';
    const FAIL       = 'fail';

    protected $objMyClass;
    
    /**
     * @brief setup: Sets up the fixture, for example, opens a network connection.
     *
     * 可以看做phpunit的构造函数
     */
    public function setup() {
        date_default_timezone_set('PRC');
        $this->objMyClass = new MyClass();
    }

    /**
     * 利用反射,对类中的private 和 protect 方法进行单元测试
     *
     * @param $strMethodName  string  :反射函数名
     * @return ReflectionMethod obj   :回调对象
     */
    protected static function getPrivateMethod($strMethodName) {
        $objReflectClass = new ReflectionClass(self::CLASS_NAME);
        $method          = $objReflectClass->getMethod($strMethodName);
        $method->setAccessible(true);
        return $method;
    }


    /**
     * @brief :测试private函数的调用
     */
    public function testPrivateFunc()
    {
        $testCase = 'just a test string';

        // 反射该类
        $testFunc = self::getPrivateMethod('privateFunc');
        $res = $testFunc->invokeArgs($this->objMyClass, array($testCase));

        $this->assertEquals($testCase, $res);
        $this->expectOutputRegex('/success/i');
        
        // 捕获没有参数异常测试
        try {
             $testFunc->invokeArgs($this->transfer2Pscase, array());
        } catch (Exception $expected) {
            $this->assertNotNull($expected);
            return true;
        }

        $this->fail(self::FAIL);
    }
    
}

运行结果

cuihuan:test cuixiaohuan$ phpunit MyClassTest.php 
PHPUnit 4.8.6 by Sebastian Bergmann and contributors.


Time: 103 ms, Memory: 11.75Mb

OK (1 test, 3 assertions)

关键代码分析

封装了一个,被测类方法的反射调用;同时,返回方法之前处理方法的接入权限为true,便可以访问private的函数方法。

/**
 * 利用反射,对类中的private 和 protect 方法进行单元测试
 *
 * @param $strMethodName  string  :反射函数名
 * @return ReflectionMethod obj   :回调对象
 */
protected static function getPrivateMethod($strMethodName) {
    $objReflectClass = new ReflectionClass(self::CLASS_NAME);
    $method          = $objReflectClass->getMethod($strMethodName);
    $method->setAccessible(true);
    return $method;
}

【转载请注明:phpunit单测中调用private方法处理 | 靠谱崔小拽 】

以上就介绍了phpunit单测中调用private方法处理,包括了require,代码分析,Exception方面的内容,希望对PHP教程有兴趣的朋友有所帮助。