PHPunit mockobject抽象和静态方法

时间:2010-07-14 14:55:14

标签: php static phpunit mocking abstract

我想从抽象类中测试一个方法。在这个类中有一个静态的抽象方法。

我使用PHPUnit。使用正常的抽象方法,它可以工作:

<?php
abstract class AbstractClass
{
  public function concreteMethod()
  {
    return $this->abstractMethod();
  }

  public abstract function abstractMethod();
}

class AbstractClassTest extends PHPUnit_Framework_TestCase
{
  public function testConcreteMethod()
  {
    $stub = $this->getMockForAbstractClass('AbstractClass');
    $stub->expects($this->any())
         ->method('abstractMethod')
         ->will($this->returnValue(TRUE));

    $this->assertTrue($stub->concreteMethod());
  }
}
?>

phpunit file.php有效。

但是如果abstractMethod是静态的,它会显示:

PHP致命错误:类Mock_AbstractClass_6332ae11包含1个抽象方法,因此必须在/usr/local/apache2/php5.3/lib/php/PHPUnit/Framework/中声明为abstract或实现其余方法(AbstractClass :: abstractMethod) TestCase.php(1135):第33行的eval()代码

2 个答案:

答案 0 :(得分:3)

你不能拥有抽象的静态方法。它将在PHP中生成E_STRICT消息。

为您的类实现设计一个替代策略。

答案 1 :(得分:0)

从PHP 5.3开始,可以使用抽象静态方法,如下所述: Why does PHP 5.2+ disallow abstract static class methods?

使用phpunit 3.5beta,以下工作:

<?php

class AbstractClassTest extends PHPUnit_Framework_TestCase
{
  public function testConcreteMethod()
  {
    $stub = new myStub;
    $this->assertTrue($stub->concreteMethod());
  }
}


abstract class AbstractClass
{
  public function concreteMethod()
  {
    return static::abstractMethod();
  }

  public static abstract function abstractMethod();
}

class myStub extends AbstractClass {
    public static function abstractMethod() {
        return true;
    }
}

?>
  

Sebastian的PHPUnit 3.5.0beta1   贝格曼。

     

请注意,从整个后期静态绑定问题开始,您需要使用“static ::”而不是“self ::”。 http://php.net/manual/en/language.oop5.late-static-bindings.php

相关问题