Tipps und Tricks Filter

PHPunit - das Problem mit abhänige "static" Methoden

Eine statische Methode zu testen ist keine Problem. Ruft diese eine weitere statische Methode auf und diese soll emuliert werden, so kommt man an "Mocking" nicht vorbei.

Ein Hinweis fand ich auf "stackoverflow". Darin ein Link zum Sebastian Bergmann Archiv.
Das darin genutzte "staticExpects" ist allerdings in PHPUnit 4.0 auf deprecated gesetzt worden und wird ab 4.1 nicht mehr unterstützt.

Leider gab es keine Alternative, die Frage danach wurde beantwortet in der Art:

"The proposed alternative is to not use static methods."
"Die vorgeschlagene Alternative besteht darin, statische Methoden nicht verwenden."

Im Blog von Tom Van Herreweghe wird dieselbe Methode erwähnt (Testing static calls). Hier ist auch im zweiten Abschnitt zu finden, wie man externe statische Methoden testen kann, ebenfalls mittels "staticExperts". (Stubbing and mocking external static methods)

 

//Class
<?php
class Foo
{
    public static function doSomething()
    {
        return static::helper();
    }
 
    public static function helper()
    {
        return 'foo';
    }
}
?>

//Test Class
<?php
class FooTest extends PHPUnit_Framework_TestCase
{
    public function testDoSomething()
    {
        $class = $this->getMockClass(
          'Foo',          /* name of class to mock     */
          array('helper') /* list of methods to mock   */
        );
 
        $class::staticExpects($this->any())
              ->method('helper')
              ->will($this->returnValue('bar'));
 
        $this->assertEquals(
          'bar',
          $class::doSomething()
        );
    }
}
?>