phpunit mock - 方法不存在

时间:2016-09-20 18:20:30

标签: php unit-testing cakephp phpunit cakephp-3.0

我最近在一个基于CakePhp 3.x的应用程序的IntegrationTestCase中将PHPunit从5.3更新到5.5。而且我不了解如何更新我的模拟生成脚本。

最初我创建了这样的模拟:

$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

为了修复此警告,我将模拟生成更改为:

$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'

有谁知道,如何避免这个错误?谢谢。

5 个答案:

答案 0 :(得分:16)

PHPUnit_Framework_TestCase::getMockBuilder()只接受一个(1)参数,即类名。模拟的方法是通过返回的模拟构建器对象setMethods()方法来定义的。

$stub = $this
    ->getMockBuilder('SomeClass')
    ->setMethods(['execute'])
    ->getMock();

另见

答案 1 :(得分:3)

当我再次遇到此问题时,我将以此作为对自己的回答:

模拟的方法可能不是私有的。

答案 2 :(得分:1)

除上方消息外:拆分模拟方法声明

代替此:

$mock
    ->method('persist')
       ->with($this->isInstanceOf(Bucket::class))
       ->willReturnSelf()
    ->method('save')
       ->willReturnSelf()
;

使用此:

$mock
    ->method('persist')
        ->willReturnSelf()
;

$mock
   ->method('save')
       ->willReturnSelf()
;

答案 3 :(得分:0)

首先,它只是

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

其次,错误表明方法execute确实存在于您的班级SomeClass中。

因此,请检查它是否真的存在且它是public而不是final

如果一切顺利,请检查完整的类名,如果它是真实的并且使用正确的命名空间指定。

为了避免使用classname的愚蠢错误,最好使用这种语法:

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

在这种情况下,如果SomeClass不存在或缺少名称空间,您将收到明确的错误。

答案 4 :(得分:0)

也许,该方法在您模拟的类中不存在。