Я пишу модульный тест на метод класса, который называет метод другого класса с помощью насмешки, только метод, который нужно назвать, объявляется как финал, таким образом, 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 и у Вас есть метод set/метод считывания для объекта, который Вы дразните, который действительно вводит проверку (чтобы гарантировать, что правильный объект был передан в метод set), необходимо будет дразнить метод считывания на классе, Вы тестируете и имеете его, возвращают другую насмешку.
пример:
класс, который будут дразнить
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();
}
}
Я не думаю, что PHPUnit поддерживает заглушку / имитацию методов final. Возможно, вам придется создать свою собственную заглушку для этой ситуации и проделать некоторые уловки с расширениями:
class myTestClassMock {
public function needsToBeCalled() {
$foo = new Class_To_Mock();
$result = $foo->needsToBeCalled();
return array('option');
}
}
Обнаружено в Руководстве по PHPUnit в Глава 11. Тестовые двойники
Ограничения
Обратите внимание, что final, private и static методы нельзя заглушить или высмеять. Они игнорируются функцией двойного тестирования PHPUnit и сохраняют свое первоначальное поведение.