phpunit mock – метод не существует

Недавно я обновил 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(); 

Смотрите также

  • Руководство PHPUnit> Тестирование парных разрядов> Mock Objects

Прежде всего, это просто

 $stub = $this->getMockBuilder('SomeClass')->getMock(); 

Во-вторых, ошибка указывает, что execute метода существует в вашем классе SomeClass .

Итак, проверьте, действительно ли он существует, и он является public а не final .

Если все хорошо, проверьте полное имя класса, если оно реально и указано с правильным пространством имен.

Чтобы избежать глупых ошибок с именем класса, лучше использовать этот синтаксис:

 $stub = $this->getMockBuilder(SomeClass::class)->getMock(); 

В этом случае, если SomeClass не существует или пространство имен пропущено, вы получите ясную ошибку.