抽象类的单元测试不一定意味着要测试接口,因为抽象类可以具有具体的方法,并且可以测试具体的方法。
在编写一些库代码时,具有某些期望在应用程序层中扩展的基类并不少见。而且,如果要确保测试了库代码,则需要使用方法来抽象类的具体方法。
我个人使用PHPUnit,它具有所谓的存根和模拟对象来帮助您测试这种事情。
直接来自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());
}
}
模拟对象给您几件事:
- 您不需要具有抽象类的具体实现,而可以使用存根代替
- 您可以调用具体方法并断言它们可以正确执行
- 如果具体方法依赖于未实现(抽象)方法,则可以使用will()PHPUnit方法对返回值进行存根