Mockery模拟框架指南
目录
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 方式,能够满足复杂的单元测试需求。通过shouldReceive
、andReturn
、andThrow
等方法,可以轻松模拟方法行为并验证调用逻辑。
9ong@TsingChan 文章内容由 AI 辅助生成。