PHPunit абстрактный и статический метод mockobject - PullRequest
1 голос
/ 14 июля 2010

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

Я использую 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

Ответы [ 2 ]

3 голосов
/ 14 июля 2010

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

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

0 голосов
/ 19 июля 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 ::" not "self:: "в целом поздняя проблема статического связывания.http://php.net/manual/en/language.oop5.late-static-bindings.php

...