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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:58:15