2010-06-20 11 views
14

Piszę test jednostkowy dla metody klasy, która wywołuje metodę innej klasy za pomocą makiety, tylko metoda, która musi zostać wywołana, jest zadeklarowana jako ostateczna, więc PHPUnit nie jest w stanie drwić z tego. Czy mogę zastosować inne podejście?Metody klasy skrótowej PHPUnit zadeklarowane jako "ostateczne"

przykład:

klasa być wyśmiewany

class Class_To_Mock 
{ 
    final public function needsToBeCalled($options) 
    { 
     ... 
    } 
} 

mój przypadek testowy

class MyTest extends PHPUnit_Framework_TestCase 
{ 
    public function testDoSomething() 
    { 
     $mock = $this->getMock('Class_To_Mock', array('needsToBeCalled')); 
     $mock->expects($this->once()) 
      ->method('needsToBeCalled') 
      ->with($this->equalTo(array('option')); 
    } 
} 

Edit: W przypadku korzystania z rozwiązania dostarczonego przez Mike B i masz Ustawiacz/getter za kpiący obiekt, który sprawdza typ (w celu zapewnienia, że ​​właściwy obiekt został przekazany do setera), yo będziesz musiał kpić z gettera z klasy, którą testujesz, i poprosić o zwrot drugiej sztuczki.

przykład:

klasa być wyśmiewany

class Class_To_Mock 
{ 
    final public function needsToBeCalled($options) 
    { 
     ... 
    } 
} 

mock

class Class_To_MockMock 
{ 
    public function needsToBeCalled($options) 
    { 
     ... 
    } 
} 

klasy mają być testowane

class Class_To_Be_Tested 
{ 
    public function setClassToMock(Class_To_Mock $classToMock) 
    { 
     ... 
    } 

    public function getClassToMock() 
    { 
     ... 
    } 

    public function doSomething() 
    { 
     $this->getClassToMock() 
      ->needsToBeCalled(array('option')); 
    } 
} 

mój przypadek testowy

class MyTest extends PHPUnit_Framework_TestCase 
{ 
    public function testDoSomething() 
    { 
     $classToTest = $this->getMock('Class_To_Be_Tested', array('getClassToMock')); 

     $mock = $this->getMock('Class_To_MockMock', array('needsToBeCalled')); 

     $classToTest->expects($this->any()) 
        ->method('getClassToMock') 
        ->will($this->returnValue($mock)); 

     $mock->expects($this->once()) 
      ->method('needsToBeCalled') 
      ->with($this->equalTo(array('option')); 

     $classToTest->doSomething(); 
    } 
} 

Odpowiedz

14

Nie sądzę, że PHPUnit obsługuje stubbing/kpiny z ostatecznych metod. Być może trzeba będzie utworzyć własną niedopałek do tej sytuacji i zrobić jakiś wewnętrzny oszustwa:

class myTestClassMock { 
    public function needsToBeCalled() { 
    $foo = new Class_To_Mock(); 
    $result = $foo->needsToBeCalled(); 
    return array('option'); 
    } 
} 

Znalazłem to w Podręczniku PHPUnit pod Chapter 11. Test Doubles

Ograniczenia

Należy pamiętać, że ostateczna, metody prywatne i statyczne nie mogą być upokorzone lub wyśmiewane. Są ignorowane przez podwójną funkcjonalność testu PHPUnit i zachowują swoje oryginalne zachowanie.

+1

Ah, nieodebrane, że w instrukcji, dzięki –

+0

Jest to dodatkowy krok trzeba Jeżeli klasa testowanie polega na procederze pobierającym/ustawiającym, który sprawdza typ sprawdzanej klasy/metody. Dodałem to do oryginalnego wpisu. –

+0

@rr Proszę rozważyć dodanie tego jako odpowiedzi, zamiast umieszczania rozwiązania w pytaniu. – BartoszKP

4

Właśnie natknąłem się na ten problem dzisiaj. Inną alternatywą jest kpić z interfejsu implementowanego przez klasę, ponieważ implementuje interfejs i używasz interfejsu jako podpowiedzi typu.

Na przykład, ze względu na problem w pytaniu, można utworzyć interfejs i używać go w sposób następujący:

interface Interface_To_Mock 
{ 
    function needsToBeCalled($options); 
} 

class Class_To_Mock implements Interface_To_Mock 
{ 
    final public function needsToBeCalled($options) 
    { 
     ... 
    } 

} 

class Class_To_Be_Tested 
{ 
    public function setClassToMock(Interface_To_Mock $classToMock) 
    { 
     ... 
    } 

    ... 
} 

class MyTest extends PHPUnit_Framework_TestCase 
{ 
    public function testDoSomething() 
    { 
     $mock = $this->getMock('Interface_To_Mock', array('needsToBeCalled')); 
     ... 
    } 
} 
Powiązane problemy