PHPUnit, Блокирующий Методы класса, объявленные как “финал”

Я пишу модульный тест на метод класса, который называет метод другого класса с помощью насмешки, только метод, который нужно назвать, объявляется как финал, таким образом, 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();
    }
}
15
задан rr. 20 June 2010 в 17:05
поделиться

1 ответ

Я не думаю, что PHPUnit поддерживает заглушку / имитацию методов final. Возможно, вам придется создать свою собственную заглушку для этой ситуации и проделать некоторые уловки с расширениями:

class myTestClassMock {
  public function needsToBeCalled() {
    $foo = new Class_To_Mock();
    $result = $foo->needsToBeCalled();
    return array('option');
  }
}

Обнаружено в Руководстве по PHPUnit в Глава 11. Тестовые двойники

Ограничения

Обратите внимание, что final, private и static методы нельзя заглушить или высмеять. Они игнорируются функцией двойного тестирования PHPUnit и сохраняют свое первоначальное поведение.

14
ответ дан 1 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: