From 658d8decbec90c4165c0b911cf6cfeb5f6601cae Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sat, 12 Mar 2022 14:25:32 +0100 Subject: [PATCH] Closes #4929 --- ChangeLog-9.5.md | 7 +++ src/Framework/MockObject/MockMethod.php | 25 ++++++++- .../with_argument_default_new_expression.phpt | 51 +++++++++++++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 tests/end-to-end/mock-objects/mock-method/with_argument_default_new_expression.phpt diff --git a/ChangeLog-9.5.md b/ChangeLog-9.5.md index 0f428949b8c..7dfa2cb6dee 100644 --- a/ChangeLog-9.5.md +++ b/ChangeLog-9.5.md @@ -2,6 +2,12 @@ All notable changes of the PHPUnit 9.5 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. +## [9.5.19] - 2022-MM-DD + +### Fixed + +* [#4929](https://github.com/sebastianbergmann/phpunit/issues/4929): Test Double code generator does not handle new expressions inside parameter default values + ## [9.5.18] - 2022-03-08 ### Fixed @@ -142,6 +148,7 @@ All notable changes of the PHPUnit 9.5 release series are documented in this fil * [#4535](https://github.com/sebastianbergmann/phpunit/issues/4535): `getMockFromWsdl()` does not handle methods that do not have parameters correctly +[9.5.19]: https://github.com/sebastianbergmann/phpunit/compare/9.5.18...9.5 [9.5.18]: https://github.com/sebastianbergmann/phpunit/compare/9.5.17...9.5.18 [9.5.17]: https://github.com/sebastianbergmann/phpunit/compare/9.5.16...9.5.17 [9.5.16]: https://github.com/sebastianbergmann/phpunit/compare/dc738383c519243b0a967f63943a848d3fd861aa...9.5.16 diff --git a/src/Framework/MockObject/MockMethod.php b/src/Framework/MockObject/MockMethod.php index 5e02cae5f0f..17b914115e2 100644 --- a/src/Framework/MockObject/MockMethod.php +++ b/src/Framework/MockObject/MockMethod.php @@ -10,11 +10,16 @@ namespace PHPUnit\Framework\MockObject; use const DIRECTORY_SEPARATOR; +use function explode; use function implode; +use function is_object; use function is_string; use function preg_match; use function preg_replace; use function sprintf; +use function strlen; +use function strpos; +use function substr; use function substr_count; use function trim; use function var_export; @@ -369,7 +374,25 @@ private static function getMethodParametersForCall(ReflectionMethod $method): st private static function exportDefaultValue(ReflectionParameter $parameter): string { try { - return (string) var_export($parameter->getDefaultValue(), true); + $defaultValue = $parameter->getDefaultValue(); + + if (!is_object($defaultValue)) { + return (string) var_export($defaultValue, true); + } + + $parameterAsString = $parameter->__toString(); + + return (string) explode( + ' = ', + substr( + substr( + $parameterAsString, + strpos($parameterAsString, ' ') + strlen(' ') + ), + 0, + -2 + ) + )[1]; // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( diff --git a/tests/end-to-end/mock-objects/mock-method/with_argument_default_new_expression.phpt b/tests/end-to-end/mock-objects/mock-method/with_argument_default_new_expression.phpt new file mode 100644 index 00000000000..58edbf08688 --- /dev/null +++ b/tests/end-to-end/mock-objects/mock-method/with_argument_default_new_expression.phpt @@ -0,0 +1,51 @@ +--TEST-- +https://github.com/sebastianbergmann/phpunit/issues/4929 +--FILE-- +getMethod('method'), + false, + false +); + +$code = $mockMethod->generateCode(); + +print $code; +--EXPECT-- + +public function method(Foo $foo = new \Foo(1, 2, 3)) + { + $__phpunit_arguments = [$foo]; + $__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]; + } + } + + $__phpunit_result = $this->__phpunit_getInvocationHandler()->invoke( + new \PHPUnit\Framework\MockObject\Invocation( + 'Bar', 'method', $__phpunit_arguments, '', $this, false + ) + ); + + return $__phpunit_result; + }