我想从抽象类中测试一个方法。在这个类中有一个静态的抽象方法。
我使用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()代码
答案 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