Mock 對像是單元測試中常用的測試替身,用於模擬類或接口的行為,並且可以精確控制其返回值或拋出異常的行為。通過Mock 對象,開發者可以在不實例化實際依賴的情況下測試函數或方法的交互邏輯。
在PHP 中,可以使用getMockBuilder 方法創建Mock 對象。該方法接受以下參數:
// 模擬 MyInterface 接口
$mock = $this->getMockBuilder(MyInterface::class)
->getMock();
// 模擬 MyClass 类并模擬其方法
$mock = $this->getMockBuilder(MyClass::class)
->setMethods(['myMethod'])
->getMock();
創建Mock 對像後,可以通過method 方法配置其行為,例如設置返回值或拋出異常:
// 配置 Mock 對像以返回 'foo'
$mock->method('getMyMethod')
->willReturn('foo');
// 配置 Mock 對像以拋出異常
$mock->method('myOtherMethod')
->willThrowException(new RuntimeException());
下面是一個示例,展示如何在單元測試中使用Mock 對象。假設有一個MyClass 類,它依賴於MyService 類:
class MyClass
{
private $myService;
public function __construct(MyService $myService)
{
$this->myService = $myService;
}
public function doSomething(): string
{
return $this->myService->getData();
}
}
MyService 類包含一個getData 方法返回字符串"foo"。為了測試MyClass::doSomething 方法,可以使用Mock 對象:
class MyClassTest extends PHPUnit_Framework_TestCase
{
public function testDoSomething()
{
// 創建 MyService Mock 對象
$mockService = $this->getMockBuilder(MyService::class)
->setMethods(['getData'])
->getMock();
// 配置 Mock 對象返回 "bar"
$mockService->method('getData')
->willReturn('bar');
// 創建 MyClass 實例並註入 Mock 對象
$myClass = new MyClass($mockService);
// 肯定 MyClass::doSomething 返回 "bar"
$this->assertEquals('bar', $myClass->doSomething());
}
}
在此測試中,我們創建了MyService 的Mock 對象並設置其返回值為"bar"。然後將該Mock 對象注入MyClass 實例,最後通過斷言驗證MyClass 與MyService 的交互是否正確。
通過使用Mock 對象,開發者可以在單元測試中高效驗證依賴關係和業務邏輯,而無需依賴實際服務或複雜環境。