模擬したいインターフェイスがあります。そのインターフェイスの実装をモックできることは知っていますが、インターフェイスをモックする方法はありますか?
<?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);
}
}
ここにあるのは:
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
興味深いことに、 PHPUnit、模擬インターフェース、およびinstanceof は、これが機能する可能性を示唆しています。
の代わりに
$http_client = $this->getMockBuilder(Cpm\Http\IClient::class);
使用する
$http_client = $this->getMock(Cpm\Http\IClient::class);
または
$http_client = $this->getMockBuilder(Cpm\Http\IClient::class)->getMock();
完全に動作します!
次は私のために働く:
$myMockObj = $this->createMock(MyInterface::class);
$http_client = $this->getMockBuilder(Cpm\Http\IClient::class)
->setMockClassName('SomeClassName')
->getMock();
setMockClassName()を使用して、状況によってこれを修正できます。