From 80d28efb76854a496f5e5da239a44b91016ee95b Mon Sep 17 00:00:00 2001 From: Christian Kuhn Date: Thu, 6 Apr 2023 13:13:05 +0200 Subject: [PATCH] [!!!][TASK] Avoid setMethods() on mocks setMethods() has been removed with phpunit 10. $this->getAccessibleMock() used this to only partially mock a test subject. The patch switches to onlyMethods() now. There is one difference: onlyMethods() fails if a methods that should be mocked does not exist, while setMethods() did not fail on this. So this is more strict now. It was frequently used in core tests mocking ['dummy'] to say "mock no method". Those have to be switched to use 'null' as argument to $this->getAccessibleMock() now. Also, when a class is refactored, and a method that has been previously mocked is removed with the refactoring, the mock has to be adapted to remove the method-mock request from the test as well now, otherwise the test will fail. Rules for the second argument of getAccessibleMock(): * "keep all methods, mock nothing": Hand over 'null' * "mock all methods": Hand over empty array [] (default) * "mock single methods": Hand over an array with method names Releases: main, 7 Resolves: #444 --- Build/phpstan/phpstan-baseline.neon | 5 ----- Classes/Core/BaseTestCase.php | 7 ++++++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Build/phpstan/phpstan-baseline.neon b/Build/phpstan/phpstan-baseline.neon index 5b01a013..f91290b6 100644 --- a/Build/phpstan/phpstan-baseline.neon +++ b/Build/phpstan/phpstan-baseline.neon @@ -1,10 +1,5 @@ parameters: ignoreErrors: - - - message: "#^Call to an undefined method PHPUnit\\\\Framework\\\\MockObject\\\\MockBuilder\\\\:\\:setMethods\\(\\)\\.$#" - count: 1 - path: ../../Classes/Core/BaseTestCase.php - - message: "#^Instantiated class PHPUnit\\\\Framework\\\\RiskyTestError not found\\.$#" count: 3 diff --git a/Classes/Core/BaseTestCase.php b/Classes/Core/BaseTestCase.php index 1573b4a7..21587013 100644 --- a/Classes/Core/BaseTestCase.php +++ b/Classes/Core/BaseTestCase.php @@ -124,10 +124,15 @@ protected function getAccessibleMock( } $mockBuilder = $this->getMockBuilder($this->buildAccessibleProxy($originalClassName)) - ->setMethods($methods) ->setConstructorArgs($arguments) ->setMockClassName($mockClassName); + if ($methods === null) { + $mockBuilder->onlyMethods([]); + } elseif (!empty($methods)) { + $mockBuilder->onlyMethods($methods); + } + if (!$callOriginalConstructor) { $mockBuilder->disableOriginalConstructor(); }