我可以使用PHPUnit模拟接口实现吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以使用PHPUnit模拟接口实现吗?相关的知识,希望对你有一定的参考价值。

我有一个我想要模拟的界面。我知道我可以模拟该接口的实现,但有没有办法只是模拟接口?

<?php
require __DIR__ . '/../vendor/autoload.php';

use MyHttpIClient as IHttpClient;  // The interface
use MySomethingElseClient as SomethingElseClient;


class SomethingElseClientTest extends PHPUnit_Framework_TestCase {
  public function testPost() {
    $url = 'some_url';
    $http_client = $this->getMockBuilder('CpmHttpIClient');
    $something_else = new SomethingElseClient($http_client, $url);
  }
}

我得到的是:

1) SomethingElseTest::testPost
Argument 1 passed to CpmSomethingElseClient::__construct() must be an instance of
MyHttpIClient, instance of PHPUnit_Framework_MockObject_MockBuilder given, called in
$PATH_TO_PHP_TEST_FILE on line $NUMBER and defined

有趣的是,PHPUnit, mocked interfaces, and instanceof会建议这可行。

答案

代替

$http_client = $this->getMockBuilder(CpmHttpIClient::class);

使用

$http_client = $this->getMock(CpmHttpIClient::class);

要么

$http_client = $this->getMockBuilder(CpmHttpIClient::class)->getMock();

完全有效!

另一答案

以下适用于我:

$myMockObj = $this->createMock(MyInterface::class);
另一答案
$http_client = $this->getMockBuilder(CpmHttpIClient::class)
                    ->setMockClassName('SomeClassName')
                    ->getMock();

在某些情况下,setMockClassName()可用于解决此问题。

以上是关于我可以使用PHPUnit模拟接口实现吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在PHPUnit中“模拟”时间吗?

在 PHPUnit 中实现给定接口的模拟对象上的未定义方法?

PHPUnit:使用注解返回特定类型真的有必要吗?

初识 PHPunit stub 模拟返回数据

PHPUnit 4.8 Mock mysql 数据库接口

使用 PHPUnit 模拟 PDO 对象