PHPUnit mock抛出不兼容的声明错误

ex3*_*x3v 6 php phpunit unit-testing mocking

我正在使用PHPUnit 3.6.10(遗憾的是我目前无法升级到更新的版本).在处理一些遗留代码的模拟时,我得到了一个奇怪的错误.尝试谷歌,只有与静态方法相关的结果出现了,这不是我的情况.

有这个课程:

class ServicesMapper extends DbMapper
{
    //... (some methods)

    public function saveTravel(ServiceTravel $oTravel) {
        $this->getAdapter()->insert('services_travels', $oTravel->getToArray());
    }

    //... (some methods)
}
Run Code Online (Sandbox Code Playgroud)

我试着嘲笑它:

(内部单元测试类)

/**
 * @return ServicesMapper
 */
private function getServicesMapperStub()
{
    $stub = $this->getMock('ServicesMapper');

    $stub->expects($this->any())
            ->method('searchBy')
            ->will($this->returnValue(array()));

    return $stub;
}
Run Code Online (Sandbox Code Playgroud)

现在,在运行这个假测试时(我知道这个测试什么都不做,这只是为了显示问题):

   /**
    * @test
    */
    public function fakeMockTest(){
        $serviceMapper = $this->getServicesMapperStub();
        $this->assertTrue(true);
    }
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Declaration of Mock_ServicesMapper_60b00178::saveTravel() 
should be compatible with ServicesMapper::saveTravel(ServiceTravel $oTravel)
Run Code Online (Sandbox Code Playgroud)

我在很多地方使用这种嘲讽方式,除了这种特殊情况外,它运作良好.我的代码出了什么问题?

顺便说一句:我也试图用嘲弄saveTravel方法解决这个问题,没有运气.

Eds*_*ina 4

您的代码看起来正确,并且可能适用于简单的存根,而不是模拟(基本上,带有期望的存根)。

对于模拟,您需要执行以下操作:

$mock = $this->getMockBuilder('ServicesMapper')
             ->setMethods(array ('searchBy'))
             ->getMock();
Run Code Online (Sandbox Code Playgroud)

您想要设置期望的所有方法都应该在 setMethods() 上声明。