You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP Mockery框架Mock函数未生效,原函数仍执行的问题求助

Mockery Mock未生效、原函数执行的解决方法

最常见原因:未使用创建的Mock对象

你创建了$mock对象,但如果测试中还是通过new MyClass()实例化原类并调用方法,必然会触发原函数的dd语句。

错误示例:

// 错误:实例化了原类,而非使用Mock对象
$obj = new MyClass();
$obj->myFunction([1, 2, 3]);

正确做法:直接使用你创建的Mock对象调用方法:

$mock = Mockery::mock(MyClass::class);
$mock->shouldReceive('myFunction')
     ->with([1, 2, 3])
     ->andReturn([]);

// 用Mock对象调用,不会执行原方法
$result = $mock->myFunction([1, 2, 3]);

其他可能原因及解决

1. 参数匹配不严格一致

Mockery的with()是严格匹配规则,若调用时传入的参数与[1, 2, 3]不完全一致(比如参数类型、顺序、值不同),Mockery会找不到匹配的期望规则。如果是部分Mock(使用makePartial()创建的Mock),会 fallback 执行原方法;即使是完全Mock,若没有匹配规则,也可能出现异常或执行原逻辑的情况。

如果不需要严格匹配参数,可以改用宽松匹配:

$mock->shouldReceive('myFunction')
     ->withAnyArgs() // 匹配任意参数
     ->andReturn([]);

2. Mockery未正确清理(PHPUnit环境)

在PHPUnit测试中,若未在测试结束后清理Mockery,可能导致后续测试的Mock状态异常。需在测试类中添加清理逻辑:

protected function tearDown(): void
{
    Mockery::close();
    parent::tearDown();
}

3. 误用部分Mock

如果你的代码中使用了makePartial()创建Mock,未被Mock覆盖的方法会执行原逻辑。若你需要完全Mock类,不要添加makePartial():

// 错误:部分Mock,未匹配的方法会执行原逻辑
$mock = Mockery::mock(MyClass::class)->makePartial();

// 正确:完全Mock,所有未设置期望的方法会抛出异常
$mock = Mockery::mock(MyClass::class);

内容的提问来源于stack exchange,提问作者Aditya Dixit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:47:18