Я пишу модульный тест для метода класса, который вызывает метод другого класса, используя макет, только метод, который должен быть вызван, объявляется как финальный, поэтому PHPUnit не может его смоделировать. Есть ли другой подход, который я могу использовать?
пример:
класс для насмешки
class Class_To_Mock
{
final public function needsToBeCalled($options)
{
...
}
}
мой тестовый кейс
class MyTest extends PHPUnit_Framework_TestCase
{
public function testDoSomething()
{
$mock = $this->getMock('Class_To_Mock', array('needsToBeCalled'));
$mock->expects($this->once())
->method('needsToBeCalled')
->with($this->equalTo(array('option'));
}
}
Редактировать: Если вы используете решение, предоставленное Майком Б, и у вас есть установщик / получатель для объекта, который вы смоделируете, который выполняет проверку типа (чтобы убедиться, что правильный объект был передан в установщик), вам нужно будет смоделировать метод получения класса, который вы тестируете, и верните другой макет.
пример:
класс для насмешки
class Class_To_Mock
{
final public function needsToBeCalled($options)
{
...
}
}
фиктивный
class Class_To_MockMock
{
public function needsToBeCalled($options)
{
...
}
}
класс для тестирования
class Class_To_Be_Tested
{
public function setClassToMock(Class_To_Mock $classToMock)
{
...
}
public function getClassToMock()
{
...
}
public function doSomething()
{
$this->getClassToMock()
->needsToBeCalled(array('option'));
}
}
мой тестовый кейс
class MyTest extends PHPUnit_Framework_TestCase
{
public function testDoSomething()
{
$classToTest = $this->getMock('Class_To_Be_Tested', array('getClassToMock'));
$mock = $this->getMock('Class_To_MockMock', array('needsToBeCalled'));
$classToTest->expects($this->any())
->method('getClassToMock')
->will($this->returnValue($mock));
$mock->expects($this->once())
->method('needsToBeCalled')
->with($this->equalTo(array('option'));
$classToTest->doSomething();
}
}