Symfony PHPUnit Mocking报错:调用未定义方法PHPUnit_Framework_MockObject_Builder_InvocationMocker::someMethod
解决PHPUnit Mocking时的「Call to undefined method」错误
嘿,兄弟,这个问题我刚学PHPUnit的时候也踩过一模一样的坑!你遇到的Error: Call to undefined method PHPUnit_Framework_MockObject_Builder_InvocationMocker::someMethod()错误,根源在于你返回的不是Mock实例,而是Mock的行为构建器对象。
问题出在哪?
看你的createMockApiClient方法:你把createMock()、expects()、method()、will()串成链式调用,最后返回的是will()方法的返回值——也就是PHPUnit_Framework_MockObject_Builder_InvocationMocker(用来配置Mock行为的构建器),而不是你最初创建的ApiClient Mock实例。
当你在测试方法里调用$mock->someMethod()时,你其实是在给这个构建器对象发消息,它当然没有someMethod这个方法啦!
修复方法
把链式调用拆分开,先创建Mock实例,再单独配置它的行为,最后返回Mock实例本身:
public function testApiClient() { $mock = createMockApiClient(); dump($mock->someMethod()); // 现在就能正常返回'someString'啦 } protected function createMockApiClient() { $mockApiClient = $this->createMock(ApiClient::class); // 单独配置Mock行为,不要把这部分的返回值直接return $mockApiClient ->expects($this->any()) ->method('someMethod') ->will($this->returnValue('someString')) ; // 返回真正的Mock实例 return $mockApiClient; }
额外小提示(可选)
如果你用的是PHPUnit 9及以上版本,可以用更简洁的语法替换will($this->returnValue(...)):
$mockApiClient ->expects($this->any()) ->method('someMethod') ->willReturn('someString'); // 更直观的写法
这样修改后,你的测试就能正常运行,调用someMethod()会返回你预设的'someString'啦!
内容的提问来源于stack exchange,提问作者Nikita_kharkov_ua
相关产品推荐
相关产品推荐

