【问题标题】:PHPUnit mock throws incompatible declaration errorPHPUnit mock 抛出不兼容的声明错误
【发布时间】:2015-02-03 18:28:45
【问题描述】:

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

有这个课程:

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 方法来解决这个问题,但没有运气。

【问题讨论】:

  • 我不确定你常用的模拟函数在做什么,因为它没有模拟你正在测试的同一个类,但我假设你已经覆盖了“Default_Model_Mapper_Services”。该错误表明您在没有参数的情况下模拟了 saveTravel(),但您的测试(和主类)需要一个 ServiceTravel 类型的参数。
  • 嗨!抱歉,我的示例中有错字。我将所有长类名称转换为短名称以使代码更具可读性,但我忘记在一个地方更改它。解决了这个问题,更新了问题。另外 - 不幸的是,saveTravel() 在我测试过的测试或生产代码中的任何地方都没有被使用或模拟。仔细检查。
  • 在您的模拟中,我注意到您正在寻找方法('searchBy'),而不是 saveTravel()。这可能不是什么,但它似乎确实没有接听电话然后使用模拟。尽管如此,该错误似乎仍然表明您的模拟(Mock_ServicesMapper_60b00178::saveTravel() 和 ServiceMapper::saveTravel(ServiceTravel $oTravel) 中的差异。看来模拟仍然没有正确定义。
  • 我知道它们是两种不同的方法。棘手的部分是,在我所有的测试中,我只使用 searchBy,从不保存旅行。
  • 那么不确定。我只能假设错误是准确的,并且正在检查 saveTravel,但模拟结构没有正确引用。

标签: php unit-testing mocking phpunit


【解决方案1】:

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

对于你需要做的模拟:

$mock = $this->getMockBuilder('ServicesMapper')
             ->setMethods(array ('searchBy'))
             ->getMock();

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

【讨论】:

  • 谢谢!试试看!
猜你喜欢
  • 2019-01-15
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 2023-03-12
  • 2011-04-04
相关资源
最近更新 更多