PHPUnit 10.5.9:使用onlyMethods模拟测试异常抛出失败求助
问题分析与解决方法
核心错误点
- Mock方法名大小写不匹配:测试中写的是
method('sendmessage'),但实际Mailer类的方法是sendMessage(驼峰命名,大写M),PHPUnit对方法名大小写敏感,导致mock没有匹配到实际调用的方法。 throwException用法错误:你把$this->throwException()放在了with()方法中,with()是用来验证方法调用时的参数,而要让mock方法抛出异常,应该将其放在will()方法里。- 重复的异常断言:同时使用了已被PHPUnit 10弃用的
@expectedException注解和$this->expectException(),两者只需保留后者即可。
修正后的测试代码
public function testNotificationThrowException() { $user = new User; $mock = $this->getMockBuilder(Mailer::class) ->onlyMethods(['sendMessage']) ->getMock(); $mock->expects($this->once()) ->method('sendMessage') // 修正方法名大小写 ->will($this->throwException(new Exception)); // 将throwException移到will()中 $this->expectException(Exception::class); // 保留现代的异常断言方式 $user->setMailer($mock); $result = $user->notify('hello'); }
额外检查点
如果修正后测试仍失败,需要确认User::notify()方法是否正确调用了$this->mailer->sendMessage(),比如是否传递了参数,或者是否有其他逻辑阻止了方法调用。例如,如果notify()方法内部没有正确触发sendMessage(),mock的异常也不会被抛出。
内容的提问来源于stack exchange,提问作者starter
相关产品推荐
相关产品推荐

