From 2b8e6d0d05fb4d9d17bf98465b2ed5ebdae661b4 Mon Sep 17 00:00:00 2001 From: Kai Dederichs Date: Tue, 18 Jan 2022 12:02:49 +0100 Subject: [PATCH 1/3] Add __toString to array of methods to be removed in pass --- .../RemoveBuiltinMethodsThatAreFinalPass.php | 1 + .../MockClassWithFinalToStringTest.php | 94 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 tests/Mockery/MockClassWithFinalToStringTest.php diff --git a/library/Mockery/Generator/StringManipulation/Pass/RemoveBuiltinMethodsThatAreFinalPass.php b/library/Mockery/Generator/StringManipulation/Pass/RemoveBuiltinMethodsThatAreFinalPass.php index 59f18cf49..3eb734d26 100644 --- a/library/Mockery/Generator/StringManipulation/Pass/RemoveBuiltinMethodsThatAreFinalPass.php +++ b/library/Mockery/Generator/StringManipulation/Pass/RemoveBuiltinMethodsThatAreFinalPass.php @@ -32,6 +32,7 @@ class RemoveBuiltinMethodsThatAreFinalPass { protected $methods = array( '__wakeup' => '/public function __wakeup\(\)\s+\{.*?\}/sm', + '__toString' => '/public function __toString\(\)\s+\{.*?\}/sm', ); public function apply($code, MockConfiguration $config) diff --git a/tests/Mockery/MockClassWithFinalToStringTest.php b/tests/Mockery/MockClassWithFinalToStringTest.php new file mode 100644 index 000000000..ad7c93b06 --- /dev/null +++ b/tests/Mockery/MockClassWithFinalToStringTest.php @@ -0,0 +1,94 @@ + + * @license http://github.com/padraic/mockery/blob/master/LICENSE New BSD License + */ + +namespace test\Mockery; + +use Mockery\Adapter\Phpunit\MockeryTestCase; + +class MockClassWithFinalToStringTest extends MockeryTestCase +{ + protected function mockeryTestSetUp() + { + $this->container = new \Mockery\Container(); + } + + protected function mockeryTestTearDown() + { + $this->container->mockery_close(); + } + + /** + * @test + * + * Test that we are able to create partial mocks of classes that have + * a __wakeup method marked as final. As long as __wakeup is not one of the + * mocked methods. + */ + public function testCreateMockForClassWithFinalToString() + { + $mock = $this->container->mock("test\Mockery\TestWithFinalToString"); + $this->assertInstanceOf("test\Mockery\TestWithFinalToString", $mock); + $this->assertEquals('test\Mockery\TestWithFinalToString::__toString', $mock->__toString()); + + $mock = $this->container->mock('test\Mockery\SubclassWithFinalToString'); + $this->assertInstanceOf('test\Mockery\TestWithFinalToString', $mock); + $this->assertEquals('test\Mockery\TestWithFinalToString::__toString', $mock->__toString()); + } + + public function testCreateMockForClassWithNonFinalToString() + { + $mock = $this->container->mock('test\Mockery\TestWithNonFinalToString'); + $this->assertInstanceOf('test\Mockery\TestWithNonFinalToString', $mock); + + // Make sure __toString is overridden. + $this->assertNotEquals('bar', $mock->__toString()); + } +} + +class TestWithFinalToString +{ + public function foo() + { + return 'foo'; + } + + public function bar() + { + return 'bar'; + } + + final public function __toString() + { + return __METHOD__; + } +} + +class SubclassWithFinalToString extends TestWithFinalToString +{ +} + +class TestWithNonFinalToString +{ + public function __toString() + { + return 'bar'; + } +} From a9588e7a6bd2ae476865aa3ede7f349db035d4ba Mon Sep 17 00:00:00 2001 From: Kai Dederichs Date: Sun, 23 Jan 2022 17:39:58 +0100 Subject: [PATCH 2/3] Account for return types in PHP 8+ --- .../Pass/RemoveBuiltinMethodsThatAreFinalPass.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/Mockery/Generator/StringManipulation/Pass/RemoveBuiltinMethodsThatAreFinalPass.php b/library/Mockery/Generator/StringManipulation/Pass/RemoveBuiltinMethodsThatAreFinalPass.php index 3eb734d26..1f475da05 100644 --- a/library/Mockery/Generator/StringManipulation/Pass/RemoveBuiltinMethodsThatAreFinalPass.php +++ b/library/Mockery/Generator/StringManipulation/Pass/RemoveBuiltinMethodsThatAreFinalPass.php @@ -32,7 +32,7 @@ class RemoveBuiltinMethodsThatAreFinalPass { protected $methods = array( '__wakeup' => '/public function __wakeup\(\)\s+\{.*?\}/sm', - '__toString' => '/public function __toString\(\)\s+\{.*?\}/sm', + '__toString' => '/public function __toString\(\)\s+(:\s+string)?\{.*?\}/sm', ); public function apply($code, MockConfiguration $config) From 2a902231ab724cc09f76755eb7d8289a9bd099a3 Mon Sep 17 00:00:00 2001 From: Kai Dederichs Date: Sun, 23 Jan 2022 17:45:23 +0100 Subject: [PATCH 3/3] Throw in an extra \s* for good measure --- .../Pass/RemoveBuiltinMethodsThatAreFinalPass.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/Mockery/Generator/StringManipulation/Pass/RemoveBuiltinMethodsThatAreFinalPass.php b/library/Mockery/Generator/StringManipulation/Pass/RemoveBuiltinMethodsThatAreFinalPass.php index 1f475da05..7b0850ed4 100644 --- a/library/Mockery/Generator/StringManipulation/Pass/RemoveBuiltinMethodsThatAreFinalPass.php +++ b/library/Mockery/Generator/StringManipulation/Pass/RemoveBuiltinMethodsThatAreFinalPass.php @@ -32,7 +32,7 @@ class RemoveBuiltinMethodsThatAreFinalPass { protected $methods = array( '__wakeup' => '/public function __wakeup\(\)\s+\{.*?\}/sm', - '__toString' => '/public function __toString\(\)\s+(:\s+string)?\{.*?\}/sm', + '__toString' => '/public function __toString\(\)\s+(:\s+string)?\s*\{.*?\}/sm', ); public function apply($code, MockConfiguration $config)