PHPUnit测试中如何全局捕获未常规设置消息的特定类型异常
解决方案
方案1:继承公共基础测试类(最简便,适配所有PHPUnit版本)
让所有测试类继承同一个自定义的基础测试类,重写runTest方法,在这一层统一捕获UserInputException,无需逐个测试添加捕获逻辑:
// 自定义基础测试类,所有业务测试类都继承该类 class BaseTestCase extends \PHPUnit\Framework\TestCase { protected function runTest() { try { parent::runTest(); } catch (\YourNamespace\UserInputException $exception) { $exceptionMessage = $exception->getUntranslatedMessage(); $this->fail("A UserInputException was thrown with message: $exceptionMessage"); } } }
说明:
runTest是PHPUnit执行单个测试用例的核心方法,所有测试逻辑都会在该方法内运行,此处添加的捕获逻辑可覆盖所有子类的测试用例。如果部分测试允许UserInputException正常抛出,可以在基础类中新增白名单标记,在catch块中增加判断跳过对应测试的捕获即可。
方案2:使用PHPUnit全局事件监听器(无需修改现有测试类继承关系)
如果不想改动现有测试的继承结构,可以通过PHPUnit全局扩展注册异常监听,全量捕获测试过程中抛出的指定异常:
步骤1:编写监听器类(适配PHPUnit 10+版本)
class UserInputExceptionListener implements \PHPUnit\Event\Test\Errored\Subscriber { public function notify(\PHPUnit\Event\Test\Errored $event): void { $throwable = $event->throwable(); if ($throwable instanceof \YourNamespace\UserInputException) { fwrite(STDERR, "UserInputException 抛出,未翻译消息:" . $throwable->getUntranslatedMessage() . PHP_EOL); // 可根据需求调整逻辑,比如直接终止测试输出失败信息 } } }
步骤2:在phpunit.xml配置文件中注册扩展
<extensions> <extension class="YourNamespace\UserInputExceptionListener" /> </extensions>
说明:如果使用PHPUnit 10以下版本,可以实现
PHPUnit\Framework\TestListener接口注册全局监听器,逻辑逻辑基本一致。
内容的提问来源于stack exchange,提问作者Ruud van der Linden
相关产品推荐
相关产品推荐

