testing抽象类

如何用PHPUnittesting抽象类的具体方法?

我希望我不得不创build某种对象作为testing的一部分。 虽然,我不知道这个最好的做法,或者如果PHPUnit允许这样做。

抽象类的unit testing不一定意味着testing接口,因为抽象类可以有具体的方法,这个具体的方法可以被testing。

编写一些库代码时,并不less见,希望在应用程序层中扩展某些基类。 如果你想确保库代码已经过testing,那么你需要用UT来表示抽象类的具体方法。

就我个人而言,我使用PHPUnit,它有所谓的存根和模拟对象来帮助你testing这种事情。

直接从PHPUnit手册 :

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()); } } 

模拟对象给你几件事情:

  • 你不需要抽象类的具体实现,而是可以用stub代替
  • 你可以调用具体的方法并声明它们正确执行
  • 如果具体方法依赖于未实现(抽象)方法,则可以使用will()PHPUnit方法来存储返回值

这是个好问题。 我一直在寻找这个。
幸运的是,PHPUnit在这种情况下已经有getMockForAbstractClass()方法,例如

 protected function setUp() { $stub = $this->getMockForAbstractClass('Some_Abstract_Class'); $this->_object = $stub; } 

重要:

请注意,这需要PHPUnit> 3.5.4。 在以前的版本中有一个错误 。

要升级到最新版本:

 sudo pear channel-update pear.phpunit.de sudo pear upgrade phpunit/PHPUnit 

纳尔逊的回答是错误的。

抽象类不要求所有的方法都是抽象的。

实施的方法是我们需要testing的方法。

你可以做的是在unit testing文件中创build一个假的存根类,让它扩展抽象类,并且只实现没有任何function的东西,当然也可以testing它。

干杯。

伊兰,你的方法应该工作,但这与在实际的代码之前写testing的倾向是背道而驰的。

我会build议的是写你的testing所需的抽象类的非抽象子类的function,然后写出抽象类和实现的子类,最后运行testing。

你的testing显然应该testing抽象类的定义方法,但总是通过子类。

如果你不想为抽象类子类化,只是为了对已经在抽象类中实现的方法进行unit testing,你可以尝试看看你的框架是否允许你抽象抽象类。