Can I mock an interface implementation with PHPUnit?
34,280
Solution 1
Instead of
$http_client = $this->getMockBuilder(Cpm\Http\IClient::class);
use
$http_client = $this->getMock(Cpm\Http\IClient::class);
or
$http_client = $this->getMockBuilder(Cpm\Http\IClient::class)->getMock();
Totally works!
Solution 2
The following works for me:
$myMockObj = $this->createMock(MyInterface::class);
Solution 3
$http_client = $this->getMockBuilder(Cpm\Http\IClient::class)
->setMockClassName('SomeClassName')
->getMock();
The setMockClassName() can be used to fix this in some circumstances.
Author by
Dmitry Minkovsky
Updated on July 09, 2022Comments
-
Dmitry Minkovsky almost 2 years
I've got an interface I'd like to mock. I know I can mock an implementation of that interface, but is there a way to just mock the interface?
<?php require __DIR__ . '/../vendor/autoload.php'; use My\Http\IClient as IHttpClient; // The interface use My\SomethingElse\Client as SomethingElseClient; class SomethingElseClientTest extends PHPUnit_Framework_TestCase { public function testPost() { $url = 'some_url'; $http_client = $this->getMockBuilder('Cpm\Http\IClient'); $something_else = new SomethingElseClient($http_client, $url); } }
What I get here is:
1) SomethingElseTest::testPost Argument 1 passed to Cpm\SomethingElse\Client::__construct() must be an instance of My\Http\IClient, instance of PHPUnit_Framework_MockObject_MockBuilder given, called in $PATH_TO_PHP_TEST_FILE on line $NUMBER and defined
Interestingly, PHPUnit, mocked interfaces, and instanceof would suggest this might work.
-
Steve almost 9 yearsI had to $mockBuilder->setMethods(['all','my','interface','methods']) to get it to work. But yeah, works perfectly. Thanks for the help.
-
lackovic10 over 4 yearsonly $this->getMockBuilder(...)->getMock() worked for me PHPUnit 7.5.1
-
BurnsBA about 2 years
$this->getMock
no long exists since PHPUnit 6 stackoverflow.com/a/42762123/1462295