2013-09-24 13 views
23

私は模擬したいインターフェイスがあります。私はそのインターフェースの実装を模擬することができますが、インターフェースを模擬する方法はありますか?PHPUnitでインタフェース実装を模擬することはできますか?

<?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, mocked interfaces, and instanceofが、これはうまくいくかもしれないことをお勧め。

+0

あなたが他の質問、それは '使用されていることを誤解している - あなたがそうであるように、'> getMockBuilder() - - 、それはあなたのようである> getMock() 'ではありません'あなたの問題への答えも見つけました。しかし、IIRCはここにあなたの質問の重複も存在しますが、私は今すぐ見つけることができません。興味深いもの: – hakre

+0

私は私の検索でそれを見つけることができませんでした。編集していただきありがとうございます。 –

+0

あなたはあなたの質問が回答とマークされるようにあなたの答えを受け入れることもできます。 – hakre

答えて

33

代わりの

http_client = $this->getMockBuilder('Cpm\Http\IClient'); 

使用

http_client = $this->getMock('Cpm\Http\IClient'); 

または

http_client = $this->getMockBuilder('Cpm\Http\IClient')->getMock(); 

は完全に動作します!

+8

私は$ mockBuilder-> setMethods(['all'、 'my'、 'interface'、 'methods'])を使って動作させる必要がありました。しかし、ええ、完璧に動作します。助けてくれてありがとう。 – Steve

7

私のために、次の作品:

$myMockObj = $this->createMock(MyInterface::class); 
関連する問題