From 4a11788cb04adb1a9ad5d76d0f618c957eb43c32 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 15 Mar 2022 10:28:44 +0100 Subject: [PATCH] Closes #4933 --- ChangeLog-9.5.md | 1 + ...id.tpl => mocked_method_never_or_void.tpl} | 0 ...d.tpl => proxied_method_never_or_void.tpl} | 0 src/Framework/MockObject/MockMethod.php | 4 +- .../return_type_declarations_never.phpt | 56 +++++++++++++++++++ 5 files changed, 59 insertions(+), 2 deletions(-) rename src/Framework/MockObject/Generator/{mocked_method_void.tpl => mocked_method_never_or_void.tpl} (100%) rename src/Framework/MockObject/Generator/{proxied_method_void.tpl => proxied_method_never_or_void.tpl} (100%) create mode 100644 tests/end-to-end/mock-objects/generator/return_type_declarations_never.phpt diff --git a/ChangeLog-9.5.md b/ChangeLog-9.5.md index 7dfa2cb6dee..e24826de576 100644 --- a/ChangeLog-9.5.md +++ b/ChangeLog-9.5.md @@ -7,6 +7,7 @@ All notable changes of the PHPUnit 9.5 release series are documented in this fil ### Fixed * [#4929](https://github.com/sebastianbergmann/phpunit/issues/4929): Test Double code generator does not handle new expressions inside parameter default values +* [#4933](https://github.com/sebastianbergmann/phpunit/issues/4933): Backport support for `never` type from PHPUnit 10 to PHPUnit 9.5 ## [9.5.18] - 2022-03-08 diff --git a/src/Framework/MockObject/Generator/mocked_method_void.tpl b/src/Framework/MockObject/Generator/mocked_method_never_or_void.tpl similarity index 100% rename from src/Framework/MockObject/Generator/mocked_method_void.tpl rename to src/Framework/MockObject/Generator/mocked_method_never_or_void.tpl diff --git a/src/Framework/MockObject/Generator/proxied_method_void.tpl b/src/Framework/MockObject/Generator/proxied_method_never_or_void.tpl similarity index 100% rename from src/Framework/MockObject/Generator/proxied_method_void.tpl rename to src/Framework/MockObject/Generator/proxied_method_never_or_void.tpl diff --git a/src/Framework/MockObject/MockMethod.php b/src/Framework/MockObject/MockMethod.php index 4343edd1a29..efa06f492bd 100644 --- a/src/Framework/MockObject/MockMethod.php +++ b/src/Framework/MockObject/MockMethod.php @@ -191,9 +191,9 @@ public function generateCode(): string { if ($this->static) { $templateFile = 'mocked_static_method.tpl'; - } elseif ($this->returnType instanceof VoidType) { + } elseif ($this->returnType->isNever() || $this->returnType->isVoid()) { $templateFile = sprintf( - '%s_method_void.tpl', + '%s_method_never_or_void.tpl', $this->callOriginalMethod ? 'proxied' : 'mocked' ); } else { diff --git a/tests/end-to-end/mock-objects/generator/return_type_declarations_never.phpt b/tests/end-to-end/mock-objects/generator/return_type_declarations_never.phpt new file mode 100644 index 00000000000..a003a8d3baa --- /dev/null +++ b/tests/end-to-end/mock-objects/generator/return_type_declarations_never.phpt @@ -0,0 +1,56 @@ +--TEST-- +\PHPUnit\Framework\MockObject\Generator::generate('Foo', [], 'MockFoo', true, true) +--SKIPIF-- +')) { + print 'skip: PHP 8.1 is required.'; +} +--FILE-- +generate( + 'Foo', + [], + 'MockFoo', + true, + true +); + +print $mock->getClassCode(); +--EXPECTF-- +declare(strict_types=1); + +class MockFoo implements PHPUnit\Framework\MockObject\MockObject, Foo +{ + use \PHPUnit\Framework\MockObject\Api; + use \PHPUnit\Framework\MockObject\Method; + use \PHPUnit\Framework\MockObject\MockedCloneMethod; + + public function bar(string $baz): never + { + $__phpunit_arguments = [$baz]; + $__phpunit_count = func_num_args(); + + if ($__phpunit_count > 1) { + $__phpunit_arguments_tmp = func_get_args(); + + for ($__phpunit_i = 1; $__phpunit_i < $__phpunit_count; $__phpunit_i++) { + $__phpunit_arguments[] = $__phpunit_arguments_tmp[$__phpunit_i]; + } + } + + $this->__phpunit_getInvocationHandler()->invoke( + new \PHPUnit\Framework\MockObject\Invocation( + 'Foo', 'bar', $__phpunit_arguments, 'never', $this, true + ) + ); + } +}