PHPUnit中调用Mock方法的类方法返回null问题求助
解决PHPUnit Mock中方法调用返回null的问题
哦,这个坑我之前踩过!你遇到的问题根源在于createMock()的行为——它会生成一个完全Mock的对象,类里所有方法都会被替换成默认返回null的Mock实现,哪怕你只手动设置了getAverageScore()的返回值,isRecommended()还是会用Mock的空实现直接返回null,根本不会执行你写的真实逻辑。
正确的解决方式:创建部分Mock对象
你需要用getMockBuilder()来构建部分Mock,只Mock你需要替换的getAverageScore()方法,让isRecommended()保留真实的代码逻辑。
修正后的测试代码应该是这样的:
public function testIsRecommended_With5_ReturnsTrue() { // 用getMockBuilder创建部分Mock,指定只Mock getAverageScore方法 $game = $this->getMockBuilder(Game::class) ->onlyMethods(['getAverageScore']) // PHPUnit 8+ 推荐用这个方法 // 如果你用的是PHPUnit 7及以下版本,替换为 setMethods(['getAverageScore']) ->getMock(); // 设置Mock方法的返回值 $game->method('getAverageScore')->willReturn(5); // 现在调用isRecommended会执行真实逻辑,调用Mock的getAverageScore拿到5 $this->assertTrue($game->isRecommended()); }
为什么这样有效?
onlyMethods(['getAverageScore'])(或旧版的setMethods())告诉PHPUnit:只对指定的方法创建Mock实现,其他方法(比如isRecommended())保持原类的真实代码逻辑。- 这样当你调用
$game->isRecommended()时,它会执行你写的return $this->getAverageScore() >= 3;逻辑,而getAverageScore()会返回你Mock的5,最终得到true的预期结果。
额外提醒
如果你不小心用了createMock()或者没指定onlyMethods(),所有方法都会被Mock,这时候哪怕是你想测试的业务方法也会返回null,这就是你之前遇到的问题啦。
内容的提问来源于stack exchange,提问作者Henry Bui
相关产品推荐
相关产品推荐

