PHPunit模拟对象抽象和静态方法

发布于 2024-09-09 10:46:09 字数 935 浏览 3 评论 0原文

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

我使用 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 Fatal error: Class Mock_AbstractClass_6332ae11 contains 1abstractmethod and must 因此被声明为抽象或实现 /usr/local/apache2/php5.3/lib/ 中的其余方法 (AbstractClass::abstractMethod) php/PHPUnit/Framework/TestCase.php(1135) : 第 33 行 eval() 代码

I would like to test a method from an abstract class. In this class is there a abstract method with is static.

I use PHPUnit. With normal abstract methods it works:

<?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 works.

But if the abstractMethod is static it displays:

PHP Fatal error: Class Mock_AbstractClass_6332ae11 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::abstractMethod) in /usr/local/apache2/php5.3/lib/php/PHPUnit/Framework/TestCase.php(1135) : eval()'d code on line 33

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

且行且努力 2024-09-16 10:46:09

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

为您的课程实施制定替代策略。

You can't have abstract static methods. It will generate an E_STRICT message in PHP.

Devise an alternative strategy for your class implementation.

昔梦 2024-09-16 10:46:09

从 PHP 5.3 开始,是否可以有抽象静态方法,这里讨论:
为什么 PHP 5.2+ 不允许抽象静态类方法?< /a>

使用 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

As of PHP 5.3 is it possible to have abstract static methods, discussed here:
Why does PHP 5.2+ disallow abstract static class methods?

With phpunit 3.5beta the following works:

<?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 by Sebastian
Bergmann.

.

Note that you need to use "static::" not "self::" as of the whole late static binding issue.
http://php.net/manual/en/language.oop5.late-static-bindings.php

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文