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.