Tricky Mock Objekte mit phpunit
26. Februar 2009Mit Mock Objekten kann man in Unit Test wunderbar Verhalten von Klassen simulieren, die außerhalb des Test Kontext liegen. Man kann zwar Methoden überschreiben und deren Rückgabewert selbst definieren.
$configuration = $this->getMock('Configuration',array('get'));
$configuration ->expects($this->any())
->method('get')
->with($this->equalsTo('key1'))
->will($this->returnValue('value1'));
Dieses erzeugt ein Ojekt vom Typ Configuration, welche bei der Methode get mit dem Parameter key1 den Wert value1 zurückgibt.
Dieses Beispiel verdeutlicht auch gleich das Problem, wenn ein Mock-Objekt bei unterschiedlichen Parametern unterschiedliche Werte zurückgeben soll. Genau das ist mit dieser Methode nicht möglich.
Folgendes Beispiel geht nicht:
$configuration = $this->getMock('Configuration',array('get')); $configuration ->expects($this->any()) ->method('get') ->with($this->equalsTo('key1')) ->will($this->returnValue('value1'));
$configuration ->expects($this->any()) ->method('get') ->with($this->equalsTo('key2')) >will($this->returnValue('value2'));
Callback nutzen.
Statt mit returnValue kann man in phpunit auch mit returnCallback arbeiten und ein wenig Logik in das Mock Objekt einbauen.
$configuration = $this->getMock('Configuration',array('get')); $configuration ->expects($this->any()) ->method('get') ->will($this->returnCallback(array($this,'getMockConfig')));
In der passenden Methode kann man die Logik einbauen:
public function getMockConfig($value){
switch($value){
case 'cache_backend':
return 't3lib_cache_backend_File';
break;
case 'cache_backend_config':
return 'defaultLifetime:3600;';
break;
case 'cache_frontend':
return 't3lib_cache_VariableCache';
break;
default:
return 'txefttestcache';
break;
}
Tags:PHP, Unittests
Veröffentlicht in Allgemein | Keine Kommentare »
