Абстрактный и статический метод PHPunit mockobject

Я хотел бы протестировать метод из абстрактного класса. В этом классе есть абстрактный метод со статичностью.

Я использую 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 абстрактный метод и поэтому должен быть объявлен абстрактным или реализовать остальные методы (AbstractClass::abstractMethod) в /usr/local/apache2/php5.3/lib/php/PHPUnit/Framework/TestCase.php (1135): код eval() в строке 33


person Charles    schedule 14.07.2010    source источник


Ответы (2)


У вас не может быть абстрактных статических методов. Это сгенерирует сообщение E_STRICT в PHP.

Разработайте альтернативную стратегию реализации вашего класса.

person Artefacto    schedule 14.07.2010

Начиная с PHP 5.3, возможно ли иметь абстрактные статические методы, обсуждаемые здесь: Почему PHP 5.2+ запрещает методы абстрактного статического класса?

С 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;
    }
}

?>

PHPUnit 3.5.0beta1 Себастьяна Бергманна.

.

Обратите внимание, что вам нужно использовать «static::», а не «self::», как и во всей проблеме позднего статического связывания. http://php.net/manual/en/language.oop5.late-static-bindings.php

person edorian    schedule 19.07.2010