問題の背景: 単一のテストでは、
サイド クラスのプライベート メソッドを直接呼び出すことができません
という一般的な問題があります。処理中に、Xiaoyan はリフレクションを通じてメソッドの権限を変更し、単一のテストを実行
し、それを共有し、コードを直接アップロードします。被侧类中的private方法无法直接调用
。小拽在处理过程中通过反射改变方法权限,进行单测
,分享一下,直接上代码。
简单被测试类
生成一个简单的被测试类,只有个private方法。
<code><?php /** * 崔小涣单测的基本模板。 * * @author cuihuan * @date 2015/11/12 22:15:31 * @version $Revision:1.0$ **/ class MyClass { /** * 私有方法 * * @param $params * @return bool */ private function privateFunc($params){ if(!isset($params)){ return false; } echo "test success"; return $params; } }</code>
单测代码
<code><?php /*************************************************************************** * * $Id: MyClassTest T,v 1.0 PsCaseTest cuihuan Exp$ * **************************************************************************/ /** * 崔小涣单测的基本模板。 * * @author cuihuan * @date 2015/11/12 22:09:31 * @version $Revision:1.0$ **/ <strong>require</strong>_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 (<strong>Exception</strong> $expected) { $this->assertNotNull($expected); return true; } $this->fail(self::FAIL); } }</code>
运行结果
<code>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)</code>
关键代码分析
封装了一个,被测类方法的反射调用;同时,返回方法之前处理方法的接入权限为true
<code>/** * 利用反射,对类中的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; } </code>
rrreee
実行結果🎜rrreee🎜 キーのコード分析🎜🎜 は、テスト対象のクラスのメソッドのリフレクション呼び出しをカプセル化すると同時に、 がメソッドを処理します。メソッドを返す前に接続する アクセス許可が true
の場合、プライベート関数のメソッドにアクセスできます。 🎜rrreee🎜【転載の際は明記してください: phpunitの単一テストでのプライベートメソッドの呼び出し信頼性のあるCui Xiaoyan】🎜
🎜
以上、phpunitの単体テストにおけるプライベートメソッドの呼び出し処理について、require、コード解析、Exceptionなどを含めて紹介しましたので、PHPチュートリアルに興味のある方の参考になれば幸いです。 🎜
🎜
🎜