1. 程式人生 > >PHPUnit測試私有屬性和方法

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 () { // 私有方法