Я пишу unit test для метода класса, который вызывает другой метод класса, используя макет, только метод, который нужно вызвать, объявляется окончательным, поэтому 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'));
}
}
Изменить: если вы используете решение, предоставленное Mike B, и у вас есть сеттер/получатель для объекта, который вы издеваетесь, который проверяет тип (чтобы гарантировать, что правильный объект был передан в сеттер), вам нужно высмеять геттер в классе, который вы тестируете, и вернуть его другому макету.
Пример:
класс, который будет издеваться
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();
}
}