PHPUnit "Mocked method does not exist." when using $mock->expects($this->at(...)) PHPUnit "Mocked method does not exist." when using $mock->expects($this->at(...)) php php

PHPUnit "Mocked method does not exist." when using $mock->expects($this->at(...))


The issue ended up being with how I understood the "at" matcher to work. Also, my example was not verbatim how it is in my unit test. I thought the "at" matcher counter worked on a per query basis, where it really works on a per object instance basis.

Example:

class MyClass {    public function exists($foo) {        return false;    }    public function find($foo) {        return $foo;    }}

Incorrect:

class MyTest extends PHPUnit_Framework_TestCase{    public function testThis()    {        $mock = $this->getMock('MyClass');        $mock->expects($this->at(0))             ->method('exists')             ->with($this->equalTo('foo'))             ->will($this->returnValue(true));        $mock->expects($this->at(0))             ->method('find')             ->with($this->equalTo('foo'))             ->will($this->returnValue('foo'));        $mock->expects($this->at(1))             ->method('exists')             ->with($this->equalTo('bar'))             ->will($this->returnValue(false));        $this->assertTrue($mock->exists("foo"));        $this->assertEquals('foo', $mock->find('foo'));        $this->assertFalse($mock->exists("bar"));    }}

Correct:

class MyTest extends PHPUnit_Framework_TestCase{    public function testThis()    {        $mock = $this->getMock('MyClass');        $mock->expects($this->at(0))             ->method('exists')             ->with($this->equalTo('foo'))             ->will($this->returnValue(true));        $mock->expects($this->at(1))             ->method('find')             ->with($this->equalTo('foo'))             ->will($this->returnValue('foo'));        $mock->expects($this->at(2))             ->method('exists')             ->with($this->equalTo('bar'))             ->will($this->returnValue(false));        $this->assertTrue($mock->exists("foo"));        $this->assertEquals('foo', $mock->find('foo'));        $this->assertFalse($mock->exists("bar"));    }}


FYI, Not sure if its related, but I encountered the same thing, but not with the $this->at() method, for me it was the $this->never() method.

This raised the error

$mock->expects($this->never())    ->method('exists')    ->with('arg');

This fixed the error

$mock->expects($this->never())    ->method('exists');  

It did the same thing when using the $this->exactly(0) method.

Hope this help someone.


Try changing $this->at(1) to $this->at(2)