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
相关产品推荐
相关产品推荐

