目录

Mockery 是一个功能强大的 PHP 模拟对象框架,常用于 PHPUnit 等测试框架的单元测试。以下是 Mockery 的常用方式和方法示例,帮助你更好地理解和使用它。

Mockery 的常用方式

1. 安装 Mockery

通过 Composer 安装 Mockery:

composer require --dev mockery/mockery

2. 创建 Mock 对象

Mockery 提供了多种方式来创建 Mock 对象:

  • 基于类或接口创建 Mock:

    $mock = \Mockery::mock('MyClass'); // 基于类创建 Mock
    $mock = \Mockery::mock('MyInterface'); // 基于接口创建 Mock
    $mock = \Mockery::mock('MyClass, MyInterface'); // 同时实现类和接口
    
  • 创建 Spy 对象: Spy 对象用于事后验证方法是否被调用,而不是在调用前设置期望。

    $spy = \Mockery::spy('MyClass');
    
  • 部分 Mock 对象: 部分 Mock 对象允许某些方法保持原有逻辑,而其他方法被 Mock。

    $partialMock = \Mockery::mock('MyClass')->makePartial();
    

3. 设置方法期望

Mockery 通过shouldReceive方法设置期望行为:

  • 设置返回值:

    $mock->shouldReceive('myMethod')
         ->andReturn('mocked value');
    
  • 设置异常抛出:

    $mock->shouldReceive('myMethod')
         ->andThrow(new \Exception("Mocked Exception"));
    
  • 指定调用次数:

    $mock->shouldReceive('myMethod')
         ->once(); // 调用一次
    $mock->shouldReceive('myMethod')
         ->twice(); // 调用两次
    $mock->shouldReceive('myMethod')
         ->times(3); // 调用三次
    
  • 验证方法是否被调用:

    $mock->shouldReceive('myMethod')
         ->andReturn('mocked value');
    
    $mock->myMethod();
    $mock->shouldHaveReceived('myMethod'); // 验证是否被调用
    

4. 参数匹配

Mockery 支持多种参数匹配方式:

  • 精确匹配:

    $mock->shouldReceive('myMethod')
         ->with('param1', 'param2')
         ->andReturn('mocked value');
    
  • 任意参数:

    $mock->shouldReceive('myMethod')
         ->with(\Mockery::any())
         ->andReturn('mocked value');
    
  • 数组参数匹配:

    $mock->shouldReceive('myMethod')
         ->with(\Mockery::hasKey('key'))
         ->andReturn('mocked value');
    

5. 验证方法调用顺序

Mockery 支持验证方法调用的顺序:

  • 顺序调用:

    $mock->shouldReceive('method1')
         ->ordered()
         ->andReturn('value1');
    
    $mock->shouldReceive('method2')
         ->ordered()
         ->andReturn('value2');
    
  • 分组顺序:

    $mock->shouldReceive('method1')
         ->ordered('group1')
         ->andReturn('value1');
    
    $mock->shouldReceive('method2')
         ->ordered('group1')
         ->andReturn('value2');
    

Mockery 方法示例

示例 1:Mock 方法返回值

$mock = \Mockery::mock('MyClass');
$mock->shouldReceive('myMethod')
     ->andReturn('mocked value');

$this->assertEquals('mocked value', $mock->myMethod());

示例 2:Mock 方法抛出异常

$mock = \Mockery::mock('MyClass');
$mock->shouldReceive('myMethod')
     ->andThrow(new \Exception("Mocked Exception"));

try {
    $mock->myMethod();
} catch (\Exception $e) {
    $this->assertEquals("Mocked Exception", $e->getMessage());
}

示例 3:验证方法调用次数

$mock = \Mockery::mock('MyClass');
$mock->shouldReceive('myMethod')
     ->twice()
     ->andReturn('mocked value');

$mock->myMethod();
$mock->myMethod();

$mock->shouldHaveReceived('myMethod')->twice();

示例 4:使用 Spy 验证方法调用

$spy = \Mockery::spy('MyClass');
$spy->myMethod();

$spy->shouldHaveReceived('myMethod');

Mockery 与 PHPUnit 结合使用

Mockery 可以与 PHPUnit 无缝结合,以下是一个完整的测试示例:

use PHPUnit\Framework\TestCase;

class MyTest extends TestCase
{
    public function testMyMethod()
    {
        $mock = \Mockery::mock('MyClass');
        $mock->shouldReceive('myMethod')
             ->andReturn('mocked value');

        $this->assertEquals('mocked value', $mock->myMethod());

        // 清理 Mockery 的 Mock 对象
        \Mockery::close();
    }
}

总结

Mockery 是一个灵活且功能强大的 Mock 框架,支持多种 Mock 和 Spy 方式,能够满足复杂的单元测试需求。通过shouldReceiveandReturnandThrow等方法,可以轻松模拟方法行为并验证调用逻辑。


9ong@TsingChan 文章内容由 AI 辅助生成。