如何使用PHPUnit测试抽象类的具体方法?
我希望在测试中能够创建一些对象,但是我不知道最佳实践是什么,也不确定PHPUnit是否允许这样做。
如何使用PHPUnit测试抽象类的具体方法?
我希望在测试中能够创建一些对象,但是我不知道最佳实践是什么,也不确定PHPUnit是否允许这样做。
对于抽象类的单元测试,并不一定意味着测试接口,因为抽象类可以有具体方法,这些具体方法可以被测试。
在编写某些库代码时,拥有某些基类并期望在应用层中进行扩展并不少见。如果您想确保库代码得到测试,您需要手段来测试抽象类的具体方法。
个人而言,我使用PHPUnit,并且它有所谓的存根(stubs)和模拟对象(mock objects)来帮助您测试这种情况。
直接引用自 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());
}
}
Mock对象给您以下几个优点:
需要注意的是,从PHP 7开始,增加了对匿名类的支持。这为您设置抽象类测试提供了另一种途径,这不依赖于PHPUnit特定功能。
class AbstractClassTest extends \PHPUnit_Framework_TestCase
{
/**
* @var AbstractClass
*/
private $testedClass;
public function setUp()
{
$this->testedClass = new class extends AbstractClass {
protected function abstractMethod()
{
// Put a barebones implementation here
}
};
}
// Put your tests here
}
这是一个很好的问题,我也一直在寻找答案。
幸运的是,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
Nelson的答案是错误的。
抽象类不需要所有方法都是抽象的。
我们需要测试的是已实现的方法。
你可以在单元测试文件中创建一个假存根类,让它扩展抽象类,并仅实现所需的内容而没有任何功能,并进行测试。
干杯。