From f9baa96ae38d71b42babb1bc72be6654dec870a4 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 --- Classes/Core/BaseTestCase.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Classes/Core/BaseTestCase.php b/Classes/Core/BaseTestCase.php index 1a97d2cf..6933db95 100644 --- a/Classes/Core/BaseTestCase.php +++ b/Classes/Core/BaseTestCase.php @@ -56,10 +56,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(); }