я использую PHPUnit 3.6.10
(к сожалению, в настоящее время я не могу перейти на более новую версию).
При работе с издевательством над устаревшим кодом я получил странную ошибку. Попробовал гугл, подошли только результаты, связанные со статическими методами, что не в моем случае.
Имея этот класс:
class ServicesMapper extends DbMapper
{
//... (some methods)
public function saveTravel(ServiceTravel $oTravel) {
$this->getAdapter()->insert('services_travels', $oTravel->getToArray());
}
//... (some methods)
}
Я пытаюсь издеваться над этим:
(внутри класса юнит-теста)
/**
* @return ServicesMapper
*/
private function getServicesMapperStub()
{
$stub = $this->getMock('ServicesMapper');
$stub->expects($this->any())
->method('searchBy')
->will($this->returnValue(array()));
return $stub;
}
Теперь, во время выполнения этого поддельного теста (я знаю, что этот тест ничего не делает, это просто для того, чтобы показать проблему):
/**
* @test
*/
public function fakeMockTest(){
$serviceMapper = $this->getServicesMapperStub();
$this->assertTrue(true);
}
Я получаю эту ошибку:
Declaration of Mock_ServicesMapper_60b00178::saveTravel()
should be compatible with ServicesMapper::saveTravel(ServiceTravel $oTravel)
Я использую этот стиль издевательства во многих местах, он работает хорошо, за исключением этого конкретного случая. Что не так с моим кодом?
Кстати, я также пытался решить эту проблему, издеваясь saveTravel
метод, без удачи.
Ваш код выглядит правильно и может работать с простыми заглушками, а не с фиктивными (в основном заглушка с ожиданиями).
Для издевательств нужно сделать:
$mock = $this->getMockBuilder('ServicesMapper')
->setMethods(array ('searchBy'))
->getMock();
Все методы, для которых вы хотите установить ожидания, должны быть объявлены в setMethods ().
Других решений пока нет …