Модульное тестирование абстрактных классов не обязательно означает тестирование интерфейса, поскольку у абстрактных классов могут быть конкретные методы, и эти конкретные методы могут быть протестированы.
При написании некоторого библиотечного кода не редкость иметь определенный базовый класс, который вы ожидаете расширить на уровне приложения. И если вы хотите убедиться, что код библиотеки протестирован, вам нужны средства для UT конкретных методов абстрактных классов.
Лично я использую 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