From 2715623b8706c95d3baee92cd40e48f250a75947 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sat, 11 Jul 2026 11:45:20 +0200 Subject: [PATCH 1/2] [CodeQuality] Add BareCreateMockAssignToDirectUseRector to phpunit-mock-to-stub set --- config/sets/phpunit-mock-to-stub.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/sets/phpunit-mock-to-stub.php b/config/sets/phpunit-mock-to-stub.php index 72cd48c8..47b26e3e 100644 --- a/config/sets/phpunit-mock-to-stub.php +++ b/config/sets/phpunit-mock-to-stub.php @@ -4,6 +4,7 @@ use Rector\Config\RectorConfig; use Rector\PHPUnit\CodeQuality\Rector\Class_\AddIntersectionVarToMockObjectPropertyRector; +use Rector\PHPUnit\CodeQuality\Rector\ClassMethod\BareCreateMockAssignToDirectUseRector; use Rector\PHPUnit\CodeQuality\Rector\Class_\AddStubIntersectionVarToStubPropertyRector; use Rector\PHPUnit\PHPUnit120\Rector\CallLike\CreateStubInCoalesceArgRector; use Rector\PHPUnit\PHPUnit120\Rector\CallLike\CreateStubOverCreateMockArgRector; @@ -21,5 +22,6 @@ MockObjectVarToStubRector::class, AddIntersectionVarToMockObjectPropertyRector::class, AddStubIntersectionVarToStubPropertyRector::class, + BareCreateMockAssignToDirectUseRector::class, ]); }; From 399dfdab7766dfeee501d630bb51b5139e7ea718 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sat, 11 Jul 2026 13:10:09 +0200 Subject: [PATCH 2/2] [CodeQuality] Skip TestCase suffix classes in RemoveNeverUsedMockPropertyRector Abstract *TestCase classes are most likely extended, with mock properties used in child classes. Skip them to avoid removing still-used mocks. --- .../Fixture/skip_test_case_suffix.php.inc | 19 +++++++++++++++++++ .../RemoveNeverUsedMockPropertyRector.php | 5 +++++ 2 files changed, 24 insertions(+) create mode 100644 rules-tests/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector/Fixture/skip_test_case_suffix.php.inc diff --git a/rules-tests/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector/Fixture/skip_test_case_suffix.php.inc b/rules-tests/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector/Fixture/skip_test_case_suffix.php.inc new file mode 100644 index 00000000..72895854 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector/Fixture/skip_test_case_suffix.php.inc @@ -0,0 +1,19 @@ +mockProperty = $this->createMock(\stdClass::class); + $this->mockProperty->expects($this->once()) + ->method('someMethod') + ->willReturn('someValue'); + } +} diff --git a/rules/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector.php b/rules/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector.php index 42b3bc7c..3f520807 100644 --- a/rules/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector.php +++ b/rules/CodeQuality/Rector/Class_/RemoveNeverUsedMockPropertyRector.php @@ -92,6 +92,11 @@ public function refactor(Node $node): ?Node return null; } + // skip abstract test case classes, as most likely extended and mock used in child classes + if (str_ends_with((string) $this->getName($node), 'TestCase')) { + return null; + } + $setUpClassMethod = $node->getMethod(MethodName::SET_UP); if (! $setUpClassMethod instanceof ClassMethod) { return null;