From 6327727408a12ba5e4e5c26a30057c9719cad134 Mon Sep 17 00:00:00 2001 From: Sergei Morozov Date: Wed, 15 May 2019 22:45:53 -0700 Subject: [PATCH] Reworked driver exception tests 1. Got rid of hard-coded exception mocks in favor of PHPUnit-generated ones where possible. 2. Reworked AbstractDriverTest::testConvertsException() to use a data provider to make testing all types of exceptions independent. 3. Updated PHPUnit since the reworked code relies on sebastianbergmann/phpunit#3604. --- composer.json | 2 +- composer.lock | 124 +++++++++--------- .../Doctrine/Tests/DBAL/DBALExceptionTest.php | 22 +--- .../Tests/DBAL/Driver/AbstractDriverTest.php | 121 ++++++----------- .../DBAL/Driver/AbstractMySQLDriverTest.php | 5 +- .../DBAL/Driver/AbstractOracleDriverTest.php | 5 +- .../Driver/AbstractPostgreSQLDriverTest.php | 5 +- .../Driver/AbstractSQLAnywhereDriverTest.php | 5 +- .../DBAL/Driver/AbstractSQLiteDriverTest.php | 5 +- 9 files changed, 132 insertions(+), 162 deletions(-) diff --git a/composer.json b/composer.json index f7db597bec2..93ce76f3195 100644 --- a/composer.json +++ b/composer.json @@ -41,7 +41,7 @@ "doctrine/coding-standard": "^6.0", "jetbrains/phpstorm-stubs": "^2018.1.2", "phpstan/phpstan": "^0.11.3", - "phpunit/phpunit": "^8.0", + "phpunit/phpunit": "^8.1.5", "symfony/console": "^2.0.5|^3.0|^4.0", "symfony/phpunit-bridge": "^3.4.5|^4.0.5" }, diff --git a/composer.lock b/composer.lock index 7ba548e3d11..f017f2cd53b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ddba260b7dfb84d2591b0a71a885166a", + "content-hash": "07e2f7f05586700d8d7bde1f2fd023e6", "packages": [ { "name": "doctrine/cache", @@ -329,27 +329,29 @@ }, { "name": "doctrine/instantiator", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" + "reference": "a2c590166b2133a4633738648b6b064edae0814a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", - "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/a2c590166b2133a4633738648b6b064edae0814a", + "reference": "a2c590166b2133a4633738648b6b064edae0814a", "shasum": "" }, "require": { "php": "^7.1" }, "require-dev": { - "athletic/athletic": "~0.1.8", + "doctrine/coding-standard": "^6.0", "ext-pdo": "*", "ext-phar": "*", - "phpunit/phpunit": "^6.2.3", - "squizlabs/php_codesniffer": "^3.0.2" + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" }, "type": "library", "extra": { @@ -374,12 +376,12 @@ } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", "keywords": [ "constructor", "instantiate" ], - "time": "2017-07-22T11:58:36+00:00" + "time": "2019-03-17T17:37:11+00:00" }, { "name": "jean85/pretty-package-versions", @@ -472,16 +474,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.8.1", + "version": "1.9.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" + "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", - "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", + "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", "shasum": "" }, "require": { @@ -516,7 +518,7 @@ "object", "object graph" ], - "time": "2018-06-11T23:09:50+00:00" + "time": "2019-04-07T13:18:21+00:00" }, { "name": "nette/bootstrap", @@ -1254,16 +1256,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "4.3.0", + "version": "4.3.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08" + "reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c", + "reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c", "shasum": "" }, "require": { @@ -1301,7 +1303,7 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-11-30T07:14:17+00:00" + "time": "2019-04-30T17:48:53+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -1534,16 +1536,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "7.0.1", + "version": "7.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "4832739a02c418397e404da6c3e4fe680b7a4de7" + "reference": "0317a769a81845c390e19684d9ba25d7f6aa4707" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4832739a02c418397e404da6c3e4fe680b7a4de7", - "reference": "4832739a02c418397e404da6c3e4fe680b7a4de7", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/0317a769a81845c390e19684d9ba25d7f6aa4707", + "reference": "0317a769a81845c390e19684d9ba25d7f6aa4707", "shasum": "" }, "require": { @@ -1593,7 +1595,7 @@ "testing", "xunit" ], - "time": "2019-02-01T07:29:14+00:00" + "time": "2019-02-26T07:38:26+00:00" }, { "name": "phpunit/php-file-iterator", @@ -1688,16 +1690,16 @@ }, { "name": "phpunit/php-timer", - "version": "2.0.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f" + "reference": "8b389aebe1b8b0578430bda0c7c95a829608e059" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f", - "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b389aebe1b8b0578430bda0c7c95a829608e059", + "reference": "8b389aebe1b8b0578430bda0c7c95a829608e059", "shasum": "" }, "require": { @@ -1709,7 +1711,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.1-dev" } }, "autoload": { @@ -1733,7 +1735,7 @@ "keywords": [ "timer" ], - "time": "2018-02-01T13:07:23+00:00" + "time": "2019-02-20T10:12:59+00:00" }, { "name": "phpunit/php-token-stream", @@ -1786,16 +1788,16 @@ }, { "name": "phpunit/phpunit", - "version": "8.0.0", + "version": "8.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "130104cf796a88dd1547dc5beb8bd555c2deb55e" + "reference": "01392d4b5878aa617e8d9bc7a529e5febc8fe956" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/130104cf796a88dd1547dc5beb8bd555c2deb55e", - "reference": "130104cf796a88dd1547dc5beb8bd555c2deb55e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/01392d4b5878aa617e8d9bc7a529e5febc8fe956", + "reference": "01392d4b5878aa617e8d9bc7a529e5febc8fe956", "shasum": "" }, "require": { @@ -1814,7 +1816,7 @@ "phpunit/php-code-coverage": "^7.0", "phpunit/php-file-iterator": "^2.0.1", "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.0", + "phpunit/php-timer": "^2.1", "sebastian/comparator": "^3.0", "sebastian/diff": "^3.0", "sebastian/environment": "^4.1", @@ -1838,7 +1840,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "8.0-dev" + "dev-master": "8.1-dev" } }, "autoload": { @@ -1864,7 +1866,7 @@ "testing", "xunit" ], - "time": "2019-02-01T05:41:59+00:00" + "time": "2019-05-14T04:57:31+00:00" }, { "name": "psr/log", @@ -2024,23 +2026,23 @@ }, { "name": "sebastian/diff", - "version": "3.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "366541b989927187c4ca70490a35615d3fef2dce" + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/366541b989927187c4ca70490a35615d3fef2dce", - "reference": "366541b989927187c4ca70490a35615d3fef2dce", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", "shasum": "" }, "require": { "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^7.0", + "phpunit/phpunit": "^7.5 || ^8.0", "symfony/process": "^2 || ^3.3 || ^4" }, "type": "library", @@ -2076,20 +2078,20 @@ "unidiff", "unified diff" ], - "time": "2018-06-10T07:54:39+00:00" + "time": "2019-02-04T06:01:07+00:00" }, { "name": "sebastian/environment", - "version": "4.1.0", + "version": "4.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "6fda8ce1974b62b14935adc02a9ed38252eca656" + "reference": "f2a2c8e1c97c11ace607a7a667d73d47c19fe404" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6fda8ce1974b62b14935adc02a9ed38252eca656", - "reference": "6fda8ce1974b62b14935adc02a9ed38252eca656", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/f2a2c8e1c97c11ace607a7a667d73d47c19fe404", + "reference": "f2a2c8e1c97c11ace607a7a667d73d47c19fe404", "shasum": "" }, "require": { @@ -2104,7 +2106,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.1-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -2129,7 +2131,7 @@ "environment", "hhvm" ], - "time": "2019-02-01T05:27:49+00:00" + "time": "2019-05-05T09:05:15+00:00" }, { "name": "sebastian/exporter", @@ -2886,16 +2888,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.10.0", + "version": "v1.11.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" + "reference": "82ebae02209c21113908c229e9883c419720738a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", + "reference": "82ebae02209c21113908c229e9883c419720738a", "shasum": "" }, "require": { @@ -2907,7 +2909,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.11-dev" } }, "autoload": { @@ -2940,7 +2942,7 @@ "polyfill", "portable" ], - "time": "2018-08-06T14:22:27+00:00" + "time": "2019-02-06T07:57:58+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -3003,16 +3005,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.1.0", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" + "reference": "1c42705be2b6c1de5904f8afacef5895cab44bf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", - "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/1c42705be2b6c1de5904f8afacef5895cab44bf8", + "reference": "1c42705be2b6c1de5904f8afacef5895cab44bf8", "shasum": "" }, "require": { @@ -3039,7 +3041,7 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2017-04-07T12:08:54+00:00" + "time": "2019-04-04T09:56:43+00:00" }, { "name": "webmozart/assert", diff --git a/tests/Doctrine/Tests/DBAL/DBALExceptionTest.php b/tests/Doctrine/Tests/DBAL/DBALExceptionTest.php index ccd1becfac9..d827fdc3b7d 100644 --- a/tests/Doctrine/Tests/DBAL/DBALExceptionTest.php +++ b/tests/Doctrine/Tests/DBAL/DBALExceptionTest.php @@ -35,24 +35,12 @@ public function testAvoidOverWrappingOnDriverException() { /** @var Driver $driver */ $driver = $this->createMock(Driver::class); - $inner = new class extends Exception implements InnerDriverException - { - /** - * {@inheritDoc} - */ - public function getErrorCode() - { - } - /** - * {@inheritDoc} - */ - public function getSQLState() - { - } - }; - $ex = new DriverException('', $inner); - $e = DBALException::driverExceptionDuringQuery($driver, $ex, ''); + /** @var InnerDriverException $inner */ + $inner = $this->createMock(InnerDriverException::class); + + $ex = new DriverException('', $inner); + $e = DBALException::driverExceptionDuringQuery($driver, $ex, ''); self::assertSame($ex, $e); } diff --git a/tests/Doctrine/Tests/DBAL/Driver/AbstractDriverTest.php b/tests/Doctrine/Tests/DBAL/Driver/AbstractDriverTest.php index 6a16dd65a91..e02c29da435 100644 --- a/tests/Doctrine/Tests/DBAL/Driver/AbstractDriverTest.php +++ b/tests/Doctrine/Tests/DBAL/Driver/AbstractDriverTest.php @@ -30,6 +30,7 @@ use Doctrine\Tests\DbalTestCase; use Exception; use ReflectionProperty; +use function array_merge; use function get_class; use function sprintf; @@ -67,29 +68,31 @@ protected function setUp() : void $this->driver = $this->createDriver(); } - public function testConvertsException() + /** + * @dataProvider exceptionConversionProvider + */ + public function testConvertsException($errorCode, $sqlState, $message, string $expectedClass) : void { if (! $this->driver instanceof ExceptionConverterDriver) { $this->markTestSkipped('This test is only intended for exception converter drivers.'); } - $data = $this->getExceptionConversions(); + $driverException = new class ($errorCode, $sqlState, $message) + extends Exception + implements DriverExceptionInterface + { + /** @var mixed */ + private $errorCode; - if (empty($data)) { - $this->fail( - sprintf( - 'No test data found for test %s. You have to return test data from %s.', - static::class . '::' . __FUNCTION__, - static::class . '::getExceptionConversionData' - ) - ); - } + /** @var mixed */ + private $sqlState; - $driverException = new class extends Exception implements DriverExceptionInterface - { - public function __construct() + public function __construct($errorCode, $sqlState, $message) { - parent::__construct('baz'); + parent::__construct($message); + + $this->errorCode = $errorCode; + $this->sqlState = $sqlState; } /** @@ -97,7 +100,7 @@ public function __construct() */ public function getErrorCode() { - return 'foo'; + return $this->errorCode; } /** @@ -105,26 +108,19 @@ public function getErrorCode() */ public function getSQLState() { - return 'bar'; + return $this->sqlState; } }; - $data[] = [$driverException, self::EXCEPTION_DRIVER]; - - $message = 'DBAL exception message'; - - foreach ($data as $item) { - /** @var $driverException \Doctrine\DBAL\Driver\DriverException */ - [$driverException, $convertedExceptionClassName] = $item; - - $convertedException = $this->driver->convertException($message, $driverException); + $dbalMessage = 'DBAL exception message'; + $dbalException = $this->driver->convertException($dbalMessage, $driverException); - self::assertSame($convertedExceptionClassName, get_class($convertedException)); + self::assertInstanceOf($expectedClass, $dbalException); - self::assertSame($driverException->getErrorCode(), $convertedException->getErrorCode()); - self::assertSame($driverException->getSQLState(), $convertedException->getSQLState()); - self::assertSame($message, $convertedException->getMessage()); - } + self::assertSame($driverException->getErrorCode(), $dbalException->getErrorCode()); + self::assertSame($driverException->getSQLState(), $dbalException->getSQLState()); + self::assertSame($driverException, $dbalException->getPrevious()); + self::assertSame($dbalMessage, $dbalException->getMessage()); } public function testCreatesDatabasePlatformForVersion() @@ -246,56 +242,25 @@ protected function getDatabasePlatformsForVersions() return []; } - protected function getExceptionConversionData() - { - return []; - } - - private function getExceptionConversions() + /** + * @return mixed[][] + */ + public static function exceptionConversionProvider() : iterable { - $data = []; - - foreach ($this->getExceptionConversionData() as $convertedExceptionClassName => $errors) { - foreach ($errors as $error) { - $driverException = new class ($error[0], $error[1], $error[2]) - extends Exception - implements DriverExceptionInterface - { - /** @var mixed */ - private $errorCode; - - /** @var mixed */ - private $sqlState; - - public function __construct($errorCode, $sqlState, $message) - { - parent::__construct($message); - - $this->errorCode = $errorCode; - $this->sqlState = $sqlState; - } - - /** - * {@inheritDoc} - */ - public function getErrorCode() - { - return $this->errorCode; - } - - /** - * {@inheritDoc} - */ - public function getSQLState() - { - return $this->sqlState; - } - }; - - $data[] = [$driverException, $convertedExceptionClassName]; + foreach (static::getExceptionConversionData() as $expectedClass => $items) { + foreach ($items as $item) { + yield array_merge($item, [$expectedClass]); } } - return $data; + yield ['foo', 'bar', 'baz', self::EXCEPTION_DRIVER]; + } + + /** + * @return array + */ + protected static function getExceptionConversionData() : array + { + return []; } } diff --git a/tests/Doctrine/Tests/DBAL/Driver/AbstractMySQLDriverTest.php b/tests/Doctrine/Tests/DBAL/Driver/AbstractMySQLDriverTest.php index cde381653a9..8a2374e2497 100644 --- a/tests/Doctrine/Tests/DBAL/Driver/AbstractMySQLDriverTest.php +++ b/tests/Doctrine/Tests/DBAL/Driver/AbstractMySQLDriverTest.php @@ -83,7 +83,10 @@ protected function getDatabasePlatformsForVersions() : array ]; } - protected function getExceptionConversionData() + /** + * {@inheritDoc} + */ + protected static function getExceptionConversionData() : array { return [ self::EXCEPTION_CONNECTION => [ diff --git a/tests/Doctrine/Tests/DBAL/Driver/AbstractOracleDriverTest.php b/tests/Doctrine/Tests/DBAL/Driver/AbstractOracleDriverTest.php index d88040e10a7..6d272571f49 100644 --- a/tests/Doctrine/Tests/DBAL/Driver/AbstractOracleDriverTest.php +++ b/tests/Doctrine/Tests/DBAL/Driver/AbstractOracleDriverTest.php @@ -60,7 +60,10 @@ protected function createSchemaManager(Connection $connection) return new OracleSchemaManager($connection); } - protected function getExceptionConversionData() + /** + * {@inheritDoc} + */ + protected static function getExceptionConversionData() : array { return [ self::EXCEPTION_CONNECTION => [ diff --git a/tests/Doctrine/Tests/DBAL/Driver/AbstractPostgreSQLDriverTest.php b/tests/Doctrine/Tests/DBAL/Driver/AbstractPostgreSQLDriverTest.php index d1159c80308..2807a715c8b 100644 --- a/tests/Doctrine/Tests/DBAL/Driver/AbstractPostgreSQLDriverTest.php +++ b/tests/Doctrine/Tests/DBAL/Driver/AbstractPostgreSQLDriverTest.php @@ -77,7 +77,10 @@ protected function getDatabasePlatformsForVersions() ]; } - protected function getExceptionConversionData() + /** + * {@inheritDoc} + */ + protected static function getExceptionConversionData() : array { return [ self::EXCEPTION_CONNECTION => [ diff --git a/tests/Doctrine/Tests/DBAL/Driver/AbstractSQLAnywhereDriverTest.php b/tests/Doctrine/Tests/DBAL/Driver/AbstractSQLAnywhereDriverTest.php index cbd23505bae..e541285a568 100644 --- a/tests/Doctrine/Tests/DBAL/Driver/AbstractSQLAnywhereDriverTest.php +++ b/tests/Doctrine/Tests/DBAL/Driver/AbstractSQLAnywhereDriverTest.php @@ -62,7 +62,10 @@ protected function getDatabasePlatformsForVersions() ]; } - protected function getExceptionConversionData() + /** + * {@inheritDoc} + */ + protected static function getExceptionConversionData() : array { return [ self::EXCEPTION_CONNECTION => [ diff --git a/tests/Doctrine/Tests/DBAL/Driver/AbstractSQLiteDriverTest.php b/tests/Doctrine/Tests/DBAL/Driver/AbstractSQLiteDriverTest.php index d92aa5d0d8d..2e97496958b 100644 --- a/tests/Doctrine/Tests/DBAL/Driver/AbstractSQLiteDriverTest.php +++ b/tests/Doctrine/Tests/DBAL/Driver/AbstractSQLiteDriverTest.php @@ -42,7 +42,10 @@ protected function createSchemaManager(Connection $connection) return new SqliteSchemaManager($connection); } - protected function getExceptionConversionData() + /** + * {@inheritDoc} + */ + protected static function getExceptionConversionData() : array { return [ self::EXCEPTION_CONNECTION => [