PHPUnit測試私有屬性和方法
一、測試類中的私有方法:
class Sample
{
private $a = 0;
private function run()
{
echo $a;
}
}
上面只是簡單的寫了一個類包含,一個私有變數和一個私有方法。對於protected和private方法,由於無法像是用public方法一樣直接呼叫,所以在使用phpunit進行單測的時候,多有不便,特別是當一個類中,對外只提供少量介面,內部使用了大量private方法的情況。
對於protected方法,建議使用繼承的方式進行測試,在此就不再贅述。而對於private方法的測試,建議使用php的反射機制來進行。話不多說,上程式碼:
class testSample()
{
$method = new ReflectionMethod('Sample', 'run');
$method->setAccessible(true); //將run方法從private變成類似於public的許可權
$method->invoke(new Sample()); //呼叫run方法
}
如果run方法是靜態的,如:
private static function run()
{
echo 'run is a private static function' ;
}
那麼invoke函式還可以這麼寫:
$method->invoke(null); //只有靜態方法可以不必傳類的例項化
如果run還需要傳參,比如:
private function run($x, $y)
{
return $x + $y;
}
那麼,測試程式碼可以改為:
$method->invokeArgs(new Sample(), array(1, 2)); //array中依次寫入要傳的引數。執行結果返回3
【注意】:利用反射的方法測試私有方法雖好,但setAccessible函式是php5.3.2版本以後才支援的(>=5.3.2)
二、私有屬性的get/set
說完了私有方法,再來看看私有屬性,依舊拿Sample類作為例子,想要獲取或設定Sample類中的私有屬性$a的值可以用如下方法:
public function testPrivateProperty()
{
$reflectedClass = new ReflectionClass('Sample');
$reflectedProperty = $reflectedClass->getProperty('a');
$reflectedProperty->setAccessible(true);
$reflectedProperty->getValue(); //獲取$a的值
$reflectedProperty->setValue(123); //給$a賦值:$a = 123;
}
上述方法對靜態屬性依然有效。
到此,是不是瞬間感覺測試私有方法或屬性變得很容易了。
相關推薦
PHPUnit測試私有屬性和方法
一、測試類中的私有方法: class Sample { private $a = 0; private function run() { echo $a; } } 上面只是簡單的寫了一個類包含,一個私有
python3面向物件(3)私有屬性和方法以及訪問私有屬性和方法的方式
python3中的私有屬性和方法是以__兩個下劃線開頭的: class Woman(object): #定義一個woman類 def __init__(self,name): self.name = name #公有屬性 self
資料封裝私有屬性和方法
1.私有屬性的封裝 私有屬性的含義是外部不能直接用 例項名.私有屬性名進行訪問,子類同樣也是一樣不能訪問, 這樣就是對資料進行封裝。只能用公共的方法裡呼叫私有屬性。 請看下這個例子`` class Date: def __init__(self,birt
轉:用反射呼叫物件的私有屬性和方法(經典)
大家都知道正常的呼叫是不可以訪問物件的private修飾的屬性和方法的,這也是java的封裝性原則。 但是有沒有方法可以強制去訪問物件的private修飾的屬性和方法呢?那就是用反射!(這個可能在面試題中被問到哦) 下面這個例子很簡單,就是定義一個dog類,裡面有個pri
javaScript中私有屬性和方法
javaScript並沒有特殊的語法來表示私有、保護、或公共屬性和方法,在這一點上與 java或其他語言是不同的,JavaScript中所有物件的成員是公用的: var myobj={ mypop:1, getProp:function(){
python中子類不能繼承父類的私有屬性和方法
#在子類中是不能繼承私有屬性和方法的, #但是私有屬性和方法可以在同一個類中被呼叫 class Person(object): def __init__(self,name): self.__name = name self._age = 12
java反射獲取私有屬性和方法demo
student物件package MaReflection; public class Student { private int num; private String name; static { System.out.println("[執行靜態區塊]");
Java中子類能否繼承父類的私有屬性和方法
Java中子類繼承父類的私有屬性和方法 寫在前面: 已經正式從事java開發一年了,在寫一個demo的時候,突然發現繼承這塊的知識,以前都沒有注意到這些,原來自己掌握的很淺薄。 通過書本看到子類擁有父類的所有屬性和方法,於是寫程式去驗證,發現父類的私有屬性和方法,子類是不能訪問的
Python 面向對象 --- 私有屬性和私有方法
處理 %d com 私有 訪問 class 無法 self. inf 01,應用場景及定義方式 應用場景 在實際開發中,對象 的 某些屬性或方法 可能只希望 在對象的內部被使用,而 不希望被外部訪問到 私有屬性 就是 對象 不希望公開的 屬性 私有方法 就是 對象 不希望
Python_從零開始學習_(38) 私有屬性和私有方法
1. 應用場景及定義方式 應用場景 在實際開發中, 物件 的 某些屬性或方法 可能只希望 在物件的內部被使用, 而 不希望在外部被訪問到 私有屬性 就是 物件&nbs
js--屬性和方法(私有/公有)
【私有變數】 在物件內部使用’var’關鍵字來宣告,而且它只能被私有函式和特權方法訪問。 【私有方法】 在物件的建構函式裡宣告(或者是通過varfunctionName=function(){…}來定義),它能被特權方法呼叫(包括物件的構造方法)和私有方法呼叫,私有函式只
面向物件程式設計-私有屬性和私有方法
1.私有屬性 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:James Tao 4 class Role(object):#執行時之後就存在記憶體裡 5 6 #建構函式 7 #作用:在例項化時做一
Java 反射呼叫類的屬性和方法(包含父類私有屬性和覆蓋重寫的方法等)
前面介紹了,反射呼叫類的構造方法來建立類的例項物件。一個類的結構包含方法(構造,靜態,非靜態)和屬性(靜態和非靜態)。按照迴圈漸進的方式,接下來,介紹反射類中屬性和普通的方法。 在這裡簡單介紹,反射呼叫屬性和方法會用到的新類,Method類和Field類。
python - 私有屬性和私有方法
私有屬性和私有方法 應用場景及定義方式 應用場景 在實際開發中,物件的某些屬性或方法可能只希望在物件的內部使用,而不希望在外部被訪問到 私有屬性 就是 物件 不希望公開的 屬性 私有方法 就是 方法 不希望公開的 方法 定義方法 在定義屬性或方法時,在屬性名或者方法名前增加兩個下劃線,定義的
class定義私有屬性和私有方法
私有方法和私有屬性,是隻能在類的內部訪問的方法和屬性,外部不能訪問。 但 ES6 不提供,只能通過變通方法模擬實現 下面是私有方法和私有屬性暴露的例子 class Foo { //公有方法 foo (baz) { this._bar(baz); }
06_私有屬性和私有方法-python
ofa %d class pri 方式 公開 keyword code elf 私有屬性和私有方法 01. 應用場景及定義方式 應用場景 在實際開發中,對象 的 某些屬性或方法 可能只希望 在對象的內部被使用,而 不希望在外部被訪問到 私有屬性 就是 對象 不希望公開的
Python----偽私有屬性和私有方法
在Python 中,並沒有真正的私有 在級屬性,方法命名時,實際是對名稱做了一些特殊處理,使得外界無法訪問到 處理方式:在名稱前面加上: 定義類名, 呼叫:_類名名稱 class Women:
python 私有屬性和私有方法
一. 類的私有變數和私有方法 1》 在python 中可以通過在屬性變數名前,加上雙下劃線定義屬性為私有屬性 2》特殊變數命名 a. _xx 以單下劃線開頭的表示的是protected(受保護的) 型別的變數,即保護型別只能靠允許其本身與子類進行訪問。若內部
Python面向物件06-私有屬性和私有方法
私有屬性和私有方法 01. 應用場景及定義方式 應用場景 在實際開發中,物件 的 某些屬性或方法 可能只希望 在物件的內部被使用,而 不希望在外部被訪問到 私有屬性 就是 物件 不希望公開的 屬性 私有方法 就是 物件 不希望公開的 方法 定義方式 在 定義屬性或
javaScript 中的私有,共有,特權屬性和方法
function constructor () { var private_v; // 私有屬性 var private_f = function () { // 私有方法