Недавно я обновил PHPunit от 5.3 до 5.5 в IntegrationTestCase приложения, основанного на CakePhp 3.x. и я не понимаю, как обновлять скрипты генерации макета.
Первоначально я создал свой макет:
$stub = $this->getMock('SomeClass', array('execute')); $stub->method('execute') ->will($this->returnValue($this->returnUrl));
После изменения на PHPUnit 5.5 это вызвало следующее предупреждение:
PHPUnit_Framework_TestCase::getMock() is deprecated, use PHPUnit_Framework_TestCase::createMock() or PHPUnit_Framework_TestCase::getMockBuilder() instead
Чтобы исправить это предупреждение, я изменил mock-generation на:
$stub = $this->getMockBuilder('SomeClass', array('execute'))->getMock(); $stub->method('execute') ->will($this->returnValue($this->returnUrl));```
Теперь при запуске теста появляется следующее сообщение об ошибке:
exception 'PHPUnit_Framework_MockObject_RuntimeException' with message 'Trying to configure method "execute" which cannot be configured because it does not exist, has not been specified, is final, or is static'
Кто-нибудь знает, как избежать этой ошибки? Спасибо.
PHPUnit_Framework_TestCase::getMockBuilder()
принимает только один (1) аргумент, имя класса. Методы для издевательства должны определяться с помощью метода setMethods()
возвращаемого объекта mock builder.
$stub = $this ->getMockBuilder('SomeClass') ->setMethods(['execute']) ->getMock();
Смотрите также
Прежде всего, это просто
$stub = $this->getMockBuilder('SomeClass')->getMock();
Во-вторых, ошибка указывает, что execute
метода существует в вашем классе SomeClass
.
Итак, проверьте, действительно ли он существует, и он является public
а не final
.
Если все хорошо, проверьте полное имя класса, если оно реально и указано с правильным пространством имен.
Чтобы избежать глупых ошибок с именем класса, лучше использовать этот синтаксис:
$stub = $this->getMockBuilder(SomeClass::class)->getMock();
В этом случае, если SomeClass не существует или пространство имен пропущено, вы получите ясную ошибку.