Tipps und Tricks Filter
PHPunit - das Problem mit "protected" und "private" Methoden
Offenbar kann PHPunit nur "public" Methoden von Klassen direkt testen. Um an "protected" und "private" ranzukommen gibt es mehrere Möglichkeiten. Zum einem, eine zusätzliche Klasse anlegen die von der eigentlichen Klasse erbt und nur alle Methoden auf public umdefiniert (darin dann nur der parent Aufruf), um dann diese zusätzliche Klasse als zu testende Klasse zu nutzen.
Ein andere Art fand ich auf "stackoverflow". Ausführlicher im Sebastian Bergmann Archiv.
Nutzt man PHP5 (> = 5.3.2) mit PHPUnit, kann man die privaten und geschützten Methoden mithilfe der "Reflection API" testen, indem diese auf öffentlich gesetzt werden vor dem Ausführen der Tests:
//Class
<?php
class Foo
{
private function doSomethingPrivate()
{
return 'blah';
}
}
?>
//Test Class
<?php
class FooTest extends PHPUnit_Framework_TestCase
{
/**
* @covers Foo::doSomethingPrivate
*/
public function testPrivateMethod()
{
$method = new ReflectionMethod(
//Class , Method
'Foo', 'doSomethingPrivate'
);
$method->setAccessible(TRUE);
$this->assertEquals(
// (Object [, mixed $parameter [, mixed $... ]])
'blah', $method->invoke(new Foo)
);
}
}
?>
