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.

Share:
34,280
Dmitry Minkovsky
Author by

Dmitry Minkovsky

Updated on July 09, 2022

Comments

  • Dmitry Minkovsky
    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
    Steve almost 9 years
    I had to $mockBuilder->setMethods(['all','my','interface','methods']) to get it to work. But yeah, works perfectly. Thanks for the help.
  • lackovic10
    lackovic10 over 4 years
    only $this->getMockBuilder(...)->getMock() worked for me PHPUnit 7.5.1
  • BurnsBA
    BurnsBA about 2 years
    $this->getMock no long exists since PHPUnit 6 stackoverflow.com/a/42762123/1462295