From: =?utf-8?q?David_Pr=C3=A9vot?= <taffit@debian.org>
Date: Sat, 12 Oct 2024 13:18:20 +0100
Subject: Make provider functions static (PHPUnit 11 Fix)

Bug-Debian: https://bugs.debian.org/1039822
---
 .../RemoteObject/Adapter/BaseAdapterTest.php       |    4 +-
 .../Factory/RemoteObject/Adapter/JsonRpcTest.php   |    2 +-
 .../Factory/RemoteObject/Adapter/SoapTest.php      |    2 +-
 .../Factory/RemoteObject/Adapter/XmlRpcTest.php    |    2 +-
 ...cessInterceptorScopeLocalizerFunctionalTest.php |    2 +-
 .../AccessInterceptorValueHolderFunctionalTest.php |    6 +-
 .../Functional/FatalPreventionFunctionalTest.php   |  149 --
 .../Functional/LazyLoadingGhostFunctionalTest.php  | 1644 --------------------
 .../LazyLoadingValueHolderFunctionalTest.php       |  774 ---------
 .../Functional/MultipleProxyGenerationTest.php     |    4 +-
 .../Functional/NullObjectFunctionalTest.php        |    4 +-
 .../Functional/RemoteObjectFunctionalTest.php      |    6 +-
 .../Generator/MethodGeneratorTest.php              |    2 +-
 .../Util/ProxiedMethodReturnExpressionTest.php     |    2 +-
 .../ProxyGenerator/AbstractProxyGeneratorTest.php  |  124 --
 .../MethodPrefixInterceptorsTest.php               |   23 -
 .../MethodSuffixInterceptorsTest.php               |   23 -
 .../AccessInterceptorScopeLocalizerTest.php        |   74 -
 .../AccessInterceptorValueHolderTest.php           |   37 -
 .../Assertion/CanProxyAssertionTest.php            |    2 +-
 .../InitializationTrackerTest.php                  |   32 -
 .../PropertyGenerator/InitializerPropertyTest.php  |   23 -
 .../PropertyGenerator/PrivatePropertiesMapTest.php |   65 -
 .../ProtectedPropertiesMapTest.php                 |   64 -
 .../LazyLoadingGhostGeneratorTest.php              |   79 -
 .../PropertyGenerator/InitializerPropertyTest.php  |   23 -
 .../PropertyGenerator/ValueHolderPropertyTest.php  |   42 -
 .../LazyLoadingValueHolderGeneratorTest.php        |   31 -
 .../ProxyGenerator/NullObjectGeneratorTest.php     |  143 --
 .../AbstractUniquePropertyNameTest.php             |   30 -
 .../PropertyGenerator/AdapterPropertyTest.php      |   23 -
 .../ProxyGenerator/RemoteObjectGeneratorTest.php   |  113 --
 .../ProxyGenerator/Util/PropertiesTest.php         |    2 +-
 .../Util/ProxiedMethodsFilterTest.php              |    4 +-
 .../Util/UnsetPropertiesGeneratorTest.php          |    2 +-
 35 files changed, 23 insertions(+), 3539 deletions(-)
 delete mode 100644 tests/ProxyManagerTest/Functional/FatalPreventionFunctionalTest.php
 delete mode 100644 tests/ProxyManagerTest/Functional/LazyLoadingGhostFunctionalTest.php
 delete mode 100644 tests/ProxyManagerTest/Functional/LazyLoadingValueHolderFunctionalTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/AbstractProxyGeneratorTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/AccessInterceptor/PropertyGenerator/MethodPrefixInterceptorsTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/AccessInterceptor/PropertyGenerator/MethodSuffixInterceptorsTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorScopeLocalizerTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorValueHolderTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/InitializationTrackerTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/InitializerPropertyTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/PrivatePropertiesMapTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/ProtectedPropertiesMapTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhostGeneratorTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/PropertyGenerator/InitializerPropertyTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/PropertyGenerator/ValueHolderPropertyTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolderGeneratorTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/NullObjectGeneratorTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/PropertyGenerator/AbstractUniquePropertyNameTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/RemoteObject/PropertyGenerator/AdapterPropertyTest.php
 delete mode 100644 tests/ProxyManagerTest/ProxyGenerator/RemoteObjectGeneratorTest.php

diff --git a/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/BaseAdapterTest.php b/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/BaseAdapterTest.php
index 1f91da1..0dbac97 100644
--- a/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/BaseAdapterTest.php
+++ b/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/BaseAdapterTest.php
@@ -26,7 +26,7 @@ final class BaseAdapterTest extends TestCase
     {
         $client = $this
             ->getMockBuilder(Client::class)
-            ->setMethods(['call'])
+            ->onlyMethods(['call'])
             ->getMock();
 
         $adapter = $this->getMockForAbstractClass(
@@ -60,7 +60,7 @@ final class BaseAdapterTest extends TestCase
     {
         $client = $this
             ->getMockBuilder(Client::class)
-            ->setMethods(['call'])
+            ->onlyMethods(['call'])
             ->getMock();
 
         $adapter = $this->getMockForAbstractClass(
diff --git a/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/JsonRpcTest.php b/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/JsonRpcTest.php
index b998960..4c0d95e 100644
--- a/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/JsonRpcTest.php
+++ b/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/JsonRpcTest.php
@@ -23,7 +23,7 @@ final class JsonRpcTest extends TestCase
      */
     public function testCanBuildAdapterWithJsonRpcClient(): void
     {
-        $client = $this->getMockBuilder(Client::class)->setMethods(['call'])->getMock();
+        $client = $this->getMockBuilder(Client::class)->onlyMethods(['call'])->getMock();
 
         $adapter = new JsonRpc($client);
 
diff --git a/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/SoapTest.php b/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/SoapTest.php
index f8f9088..bf3bb15 100644
--- a/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/SoapTest.php
+++ b/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/SoapTest.php
@@ -23,7 +23,7 @@ final class SoapTest extends TestCase
      */
     public function testCanBuildAdapterWithSoapRpcClient(): void
     {
-        $client = $this->getMockBuilder(Client::class)->setMethods(['call'])->getMock();
+        $client = $this->getMockBuilder(Client::class)->onlyMethods(['call'])->getMock();
 
         $adapter = new Soap($client);
 
diff --git a/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/XmlRpcTest.php b/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/XmlRpcTest.php
index e957b84..639ac8a 100644
--- a/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/XmlRpcTest.php
+++ b/tests/ProxyManagerTest/Factory/RemoteObject/Adapter/XmlRpcTest.php
@@ -23,7 +23,7 @@ final class XmlRpcTest extends TestCase
      */
     public function testCanBuildAdapterWithXmlRpcClient(): void
     {
-        $client = $this->getMockBuilder(Client::class)->setMethods(['call'])->getMock();
+        $client = $this->getMockBuilder(Client::class)->onlyMethods(['call'])->getMock();
 
         $adapter = new XmlRpc($client);
 
diff --git a/tests/ProxyManagerTest/Functional/AccessInterceptorScopeLocalizerFunctionalTest.php b/tests/ProxyManagerTest/Functional/AccessInterceptorScopeLocalizerFunctionalTest.php
index f02eaf7..7f7cbc2 100644
--- a/tests/ProxyManagerTest/Functional/AccessInterceptorScopeLocalizerFunctionalTest.php
+++ b/tests/ProxyManagerTest/Functional/AccessInterceptorScopeLocalizerFunctionalTest.php
@@ -399,7 +399,7 @@ final class AccessInterceptorScopeLocalizerFunctionalTest extends TestCase
      *
      * @return array<int, array<int, object|AccessInterceptorInterface|string>>
      */
-    public function getPropertyAccessProxies(): array
+    public static function getPropertyAccessProxies(): array
     {
         $instance = new BaseClass();
 
diff --git a/tests/ProxyManagerTest/Functional/AccessInterceptorValueHolderFunctionalTest.php b/tests/ProxyManagerTest/Functional/AccessInterceptorValueHolderFunctionalTest.php
index d57ff51..8818657 100644
--- a/tests/ProxyManagerTest/Functional/AccessInterceptorValueHolderFunctionalTest.php
+++ b/tests/ProxyManagerTest/Functional/AccessInterceptorValueHolderFunctionalTest.php
@@ -423,7 +423,7 @@ final class AccessInterceptorValueHolderFunctionalTest extends TestCase
      *
      * @return string[][]|object[][]|mixed[][]
      */
-    public function getProxyMethods(): array
+    public static function getProxyMethods(): array
     {
         $selfHintParam = new ClassWithSelfHint();
         $empty         = new EmptyClass();
@@ -473,7 +473,7 @@ final class AccessInterceptorValueHolderFunctionalTest extends TestCase
      *
      * @return array<int, array<int, object|AccessInterceptorValueHolderInterface|string>>
      */
-    public function getPropertyAccessProxies(): array
+    public static function getPropertyAccessProxies(): array
     {
         $instance1             = new BaseClass();
         $instance2             = new BaseClass();
@@ -622,7 +622,7 @@ final class AccessInterceptorValueHolderFunctionalTest extends TestCase
         self::assertSame($expectedValue, $accessor($proxy));
     }
 
-    public function getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope(): Generator
+    public static function getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope(): Generator
     {
         foreach ((new ReflectionClass(OtherObjectAccessClass::class))->getProperties() as $property) {
             $property->setAccessible(true);
diff --git a/tests/ProxyManagerTest/Functional/FatalPreventionFunctionalTest.php b/tests/ProxyManagerTest/Functional/FatalPreventionFunctionalTest.php
deleted file mode 100644
index eebd45a..0000000
--- a/tests/ProxyManagerTest/Functional/FatalPreventionFunctionalTest.php
+++ /dev/null
@@ -1,149 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\Functional;
-
-use PHPUnit\Framework\TestCase;
-use ProxyManager\Exception\ExceptionInterface;
-use ProxyManager\Generator\ClassGenerator;
-use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
-use ProxyManager\Proxy\ProxyInterface;
-use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizerGenerator;
-use ProxyManager\ProxyGenerator\AccessInterceptorValueHolderGenerator;
-use ProxyManager\ProxyGenerator\LazyLoadingGhostGenerator;
-use ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator;
-use ProxyManager\ProxyGenerator\NullObjectGenerator;
-use ProxyManager\ProxyGenerator\ProxyGeneratorInterface;
-use ProxyManager\ProxyGenerator\RemoteObjectGenerator;
-use ProxyManager\Signature\ClassSignatureGenerator;
-use ProxyManager\Signature\SignatureGenerator;
-use ReflectionClass;
-use ReflectionException;
-
-use function array_filter;
-use function array_map;
-use function array_merge;
-use function get_declared_classes;
-use function realpath;
-use function strpos;
-use function uniqid;
-
-/**
- * Verifies that proxy-manager will not attempt to `eval()` code that will cause fatal errors
- *
- * @group Functional
- * @coversNothing
- */
-final class FatalPreventionFunctionalTest extends TestCase
-{
-    /**
-     * Verifies that code generation and evaluation will not cause fatals with any given class
-     *
-     * @param string $generatorClass an instantiable class (no arguments) implementing
-     *                               the {@see \ProxyManager\ProxyGenerator\ProxyGeneratorInterface}
-     * @param string $className      a valid (existing/autoloadable) class name
-     * @psalm-param class-string<ProxyGeneratorInterface> $generatorClass
-     * @psalm-param class-string                          $className
-     *
-     * @dataProvider getTestedClasses
-     */
-    public function testCodeGeneration(string $generatorClass, string $className): void
-    {
-        $generatedClass          = new ClassGenerator(uniqid('generated', true));
-        $generatorStrategy       = new EvaluatingGeneratorStrategy();
-        $classGenerator          = new $generatorClass();
-        $classSignatureGenerator = new ClassSignatureGenerator(new SignatureGenerator());
-
-        try {
-            $classGenerator->generate(new ReflectionClass($className), $generatedClass);
-            $classSignatureGenerator->addSignature($generatedClass, ['key' => 'eval tests']);
-            $generatorStrategy->generate($generatedClass);
-        } catch (ExceptionInterface $e) {
-            // empty catch: this is actually a supported failure
-        } catch (ReflectionException $e) {
-            // empty catch: this is actually a supported failure
-        }
-
-        self::assertTrue(true, 'Code generation succeeded: proxy is valid or couldn\'t be generated at all');
-    }
-
-    /**
-     * @return string[][]
-     * @psalm-return array<int, array<int, class-string<ProxyGeneratorInterface>|class-string>>
-     */
-    public function getTestedClasses(): array
-    {
-        return array_merge(
-            [],
-            ...array_map(
-                function ($generator): array {
-                    return array_map(
-                        static function ($class) use ($generator): array {
-                            return [$generator, $class];
-                        },
-                        $this->getProxyTestedClasses()
-                    );
-                },
-                [
-                    AccessInterceptorScopeLocalizerGenerator::class,
-                    AccessInterceptorValueHolderGenerator::class,
-                    LazyLoadingGhostGenerator::class,
-                    LazyLoadingValueHolderGenerator::class,
-                    NullObjectGenerator::class,
-                    RemoteObjectGenerator::class,
-                ]
-            )
-        );
-    }
-
-    /**
-     * @return string[]
-     * @psalm-return array<int, class-string>
-     *
-     * @private (public only for PHP 5.3 compatibility)
-     */
-    private function getProxyTestedClasses(): array
-    {
-        $skippedPaths = [
-            realpath(__DIR__ . '/../../../src'),
-            realpath(__DIR__ . '/../../../vendor'),
-            realpath(__DIR__ . '/../../ProxyManagerTest'),
-            realpath(__DIR__ . '/../../../ProxyManager'),
-            realpath('/usr/share/php'),
-        ];
-
-        return array_filter(
-            get_declared_classes(),
-            static function ($className) use ($skippedPaths): bool {
-                $reflectionClass = new ReflectionClass($className);
-
-                $fileName = $reflectionClass->getFileName();
-
-                if (! $fileName) {
-                    return false;
-                }
-
-                if ($reflectionClass->implementsInterface(ProxyInterface::class)) {
-                    return false;
-                }
-
-                $realPath = realpath($fileName);
-
-                self::assertIsString($realPath);
-
-                foreach ($skippedPaths as $skippedPath) {
-                    self::assertIsString($skippedPath);
-
-                    if (strpos($realPath, $skippedPath) === 0) {
-                        // skip classes defined within ProxyManager, vendor or the test suite
-                        // as well as the system ones (where dependencies are actually installed)
-                        return false;
-                    }
-                }
-
-                return true;
-            }
-        );
-    }
-}
diff --git a/tests/ProxyManagerTest/Functional/LazyLoadingGhostFunctionalTest.php b/tests/ProxyManagerTest/Functional/LazyLoadingGhostFunctionalTest.php
deleted file mode 100644
index 7864ea4..0000000
--- a/tests/ProxyManagerTest/Functional/LazyLoadingGhostFunctionalTest.php
+++ /dev/null
@@ -1,1644 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\Functional;
-
-use BadMethodCallException;
-use Closure;
-use PHPUnit\Framework\MockObject\MockObject as Mock;
-use PHPUnit\Framework\TestCase;
-use ProxyManager\Factory\LazyLoadingGhostFactory;
-use ProxyManager\Proxy\GhostObjectInterface;
-use ProxyManager\Proxy\LazyLoadingInterface;
-use ProxyManager\ProxyGenerator\Util\Properties;
-use ProxyManagerTestAsset\BaseClass;
-use ProxyManagerTestAsset\CallableInterface;
-use ProxyManagerTestAsset\ClassWithAbstractPublicMethod;
-use ProxyManagerTestAsset\ClassWithCollidingPrivateInheritedProperties;
-use ProxyManagerTestAsset\ClassWithCounterConstructor;
-use ProxyManagerTestAsset\ClassWithDynamicArgumentsMethod;
-use ProxyManagerTestAsset\ClassWithMethodWithByRefVariadicFunction;
-use ProxyManagerTestAsset\ClassWithMethodWithVariadicFunction;
-use ProxyManagerTestAsset\ClassWithMixedProperties;
-use ProxyManagerTestAsset\ClassWithMixedPropertiesAndAccessorMethods;
-use ProxyManagerTestAsset\ClassWithMixedTypedProperties;
-use ProxyManagerTestAsset\ClassWithParentHint;
-use ProxyManagerTestAsset\ClassWithPrivateProperties;
-use ProxyManagerTestAsset\ClassWithProtectedProperties;
-use ProxyManagerTestAsset\ClassWithPublicArrayProperty;
-use ProxyManagerTestAsset\ClassWithPublicProperties;
-use ProxyManagerTestAsset\ClassWithPublicStringNullableTypedProperty;
-use ProxyManagerTestAsset\ClassWithPublicStringTypedProperty;
-use ProxyManagerTestAsset\ClassWithReadOnlyProperties;
-use ProxyManagerTestAsset\ClassWithSelfHint;
-use ProxyManagerTestAsset\EmptyClass;
-use ProxyManagerTestAsset\NeverCounter;
-use ProxyManagerTestAsset\OtherObjectAccessClass;
-use ProxyManagerTestAsset\VoidCounter;
-use ReflectionClass;
-use ReflectionProperty;
-use RuntimeException;
-use stdClass;
-
-use function array_key_exists;
-use function array_values;
-use function assert;
-use function get_class;
-use function get_parent_class;
-use function random_int;
-use function serialize;
-use function sprintf;
-use function str_replace;
-use function uniqid;
-use function unserialize;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhostGenerator} produced objects
- *
- * @group Functional
- * @coversNothing
- */
-final class LazyLoadingGhostFunctionalTest extends TestCase
-{
-    /**
-     * @param mixed[] $params
-     * @psalm-param class-string<OriginalClass> $className
-     * @psalm-param OriginalClass $instance
-     *
-     * @dataProvider getProxyInitializingMethods
-     * @psalm-template OriginalClass
-     */
-    public function testMethodCallsThatLazyLoadTheObject(
-        string $className,
-        $instance,
-        string $method,
-        array $params,
-        $expectedValue
-    ): void {
-        $proxy = (new LazyLoadingGhostFactory())
-            ->createProxy($className, $this->createInitializer($className, $instance));
-
-        self::assertFalse($proxy->isProxyInitialized());
-
-        $callProxyMethod = [$proxy, $method];
-        $parameterValues = array_values($params);
-
-        self::assertIsCallable($callProxyMethod);
-        self::assertSame($expectedValue, $callProxyMethod(...$parameterValues));
-        self::assertTrue($proxy->isProxyInitialized());
-    }
-
-    /**
-     * @param mixed[] $params
-     * @psalm-param class-string<OriginalClass> $className
-     * @psalm-param OriginalClass $instance
-     *
-     * @dataProvider getProxyNonInitializingMethods
-     * @psalm-template OriginalClass
-     */
-    public function testMethodCallsThatDoNotLazyLoadTheObject(
-        string $className,
-        $instance,
-        string $method,
-        array $params,
-        $expectedValue
-    ): void {
-        $initializeMatcher = $this->createMock(CallableInterface::class);
-
-        $initializeMatcher->expects(self::never())->method('__invoke'); // should not initialize the proxy
-
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            $className,
-            $this->createInitializer($className, $instance, $initializeMatcher)
-        );
-
-        self::assertFalse($proxy->isProxyInitialized());
-
-        $callProxyMethod = [$proxy, $method];
-        $parameterValues = array_values($params);
-
-        self::assertIsCallable($callProxyMethod);
-        self::assertSame($expectedValue, $callProxyMethod(...$parameterValues));
-        self::assertFalse($proxy->isProxyInitialized());
-    }
-
-    /**
-     * @param mixed[] $params
-     * @psalm-param class-string<OriginalClass> $className
-     * @psalm-param OriginalClass $instance
-     *
-     * @dataProvider getProxyMethods
-     * @psalm-template OriginalClass
-     */
-    public function testMethodCallsAfterUnSerialization(
-        string $className,
-        $instance,
-        string $method,
-        array $params,
-        $expectedValue
-    ): void {
-        $proxy = unserialize(serialize((new LazyLoadingGhostFactory())->createProxy(
-            $className,
-            $this->createInitializer($className, $instance)
-        )));
-        assert($proxy instanceof GhostObjectInterface);
-
-        self::assertTrue($proxy->isProxyInitialized());
-
-        $callProxyMethod = [$proxy, $method];
-        $parameterValues = array_values($params);
-
-        self::assertIsCallable($callProxyMethod);
-        self::assertSame($expectedValue, $callProxyMethod(...$parameterValues));
-    }
-
-    /**
-     * @param mixed[] $params
-     * @psalm-param class-string<OriginalClass> $className
-     * @psalm-param OriginalClass $instance
-     *
-     * @dataProvider getProxyMethods
-     * @psalm-template OriginalClass
-     */
-    public function testMethodCallsAfterCloning(
-        string $className,
-        $instance,
-        string $method,
-        array $params,
-        $expectedValue
-    ): void {
-        $proxy  = (new LazyLoadingGhostFactory())->createProxy(
-            $className,
-            $this->createInitializer($className, $instance)
-        );
-        $cloned = clone $proxy;
-
-        self::assertTrue($cloned->isProxyInitialized());
-
-        $callProxyMethod = [$proxy, $method];
-        $parameterValues = array_values($params);
-
-        self::assertIsCallable($callProxyMethod);
-        self::assertSame($expectedValue, $callProxyMethod(...$parameterValues));
-    }
-
-    /**
-     * @dataProvider getPropertyAccessProxies
-     */
-    public function testPropertyReadAccess(
-        $instance,
-        GhostObjectInterface $proxy,
-        string $publicProperty,
-        $propertyValue
-    ): void {
-        self::assertSame($propertyValue, $proxy->$publicProperty);
-        self::assertTrue($proxy->isProxyInitialized());
-    }
-
-    /**
-     * @dataProvider getPropertyAccessProxies
-     */
-    public function testPropertyWriteAccess($instance, GhostObjectInterface $proxy, string $publicProperty): void
-    {
-        $newValue               = uniqid('', true);
-        $proxy->$publicProperty = $newValue;
-
-        self::assertTrue($proxy->isProxyInitialized());
-        self::assertSame($newValue, $proxy->$publicProperty);
-    }
-
-    /**
-     * @dataProvider getPropertyAccessProxies
-     */
-    public function testPropertyExistence($instance, GhostObjectInterface $proxy, string $publicProperty): void
-    {
-        self::assertSame(isset($instance->$publicProperty), isset($proxy->$publicProperty));
-        self::assertTrue($proxy->isProxyInitialized());
-    }
-
-    /**
-     * @dataProvider getPropertyAccessProxies
-     */
-    public function testPropertyAbsence($instance, GhostObjectInterface $proxy, string $publicProperty): void
-    {
-        $propertyType = \PHP_VERSION_ID >= 70400 ? (new ReflectionProperty($instance, $publicProperty))->getType() : null;
-
-        if ($propertyType !== null && ! $propertyType->allowsNull()) {
-            self::markTestSkipped('Non-nullable typed properties cannot be removed/unset');
-        }
-
-        $proxy->$publicProperty = null;
-        self::assertFalse(isset($proxy->$publicProperty));
-        self::assertTrue($proxy->isProxyInitialized());
-    }
-
-    /**
-     * @dataProvider getPropertyAccessProxies
-     */
-    public function testPropertyUnset($instance, GhostObjectInterface $proxy, string $publicProperty): void
-    {
-        unset($proxy->$publicProperty);
-
-        self::assertTrue($proxy->isProxyInitialized());
-        self::assertTrue(isset($instance->$publicProperty));
-        self::assertFalse(isset($proxy->$publicProperty));
-    }
-
-    /**
-     * Verifies that accessing a public property containing an array behaves like in a normal context
-     */
-    public function testCanWriteToArrayKeysInPublicProperty(): void
-    {
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            ClassWithPublicArrayProperty::class,
-            $this->createInitializer(ClassWithPublicArrayProperty::class, new ClassWithPublicArrayProperty())
-        );
-
-        $proxy->arrayProperty['foo'] = 'bar';
-
-        self::assertByRefVariableValueSame('bar', $proxy->arrayProperty['foo']);
-
-        $proxy->arrayProperty = ['tab' => 'taz'];
-
-        self::assertSame(['tab' => 'taz'], $proxy->arrayProperty);
-    }
-
-    /**
-     * Verifies that public properties retrieved via `__get` don't get modified in the object itself
-     */
-    public function testWillNotModifyRetrievedPublicProperties(): void
-    {
-        $proxy    = (new LazyLoadingGhostFactory())->createProxy(
-            ClassWithPublicProperties::class,
-            $this->createInitializer(ClassWithPublicProperties::class, new ClassWithPublicProperties())
-        );
-        $variable = $proxy->property0;
-
-        self::assertByRefVariableValueSame('property0', $variable);
-
-        $variable = 'foo';
-
-        self::assertSame('property0', $proxy->property0);
-        self::assertByRefVariableValueSame('foo', $variable);
-    }
-
-    /**
-     * Verifies that public properties references retrieved via `__get` modify in the object state
-     */
-    public function testWillModifyByRefRetrievedPublicProperties(): void
-    {
-        $instance = new ClassWithPublicProperties();
-        $proxy    = (new LazyLoadingGhostFactory())->createProxy(
-            ClassWithPublicProperties::class,
-            $this->createInitializer(ClassWithPublicProperties::class, $instance)
-        );
-        $variable = & $proxy->property0;
-
-        self::assertByRefVariableValueSame('property0', $variable);
-
-        $variable = 'foo';
-
-        self::assertSame('foo', $proxy->property0);
-        self::assertByRefVariableValueSame('foo', $variable);
-    }
-
-    public function testKeepsInitializerWhenNotOverwitten(): void
-    {
-        $initializer = static function (): bool {
-            return true;
-        };
-
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            BaseClass::class,
-            $initializer
-        );
-
-        $proxy->initializeProxy();
-
-        self::assertSame($initializer, $proxy->getProxyInitializer());
-    }
-
-    /**
-     * Verifies that public properties are not being initialized multiple times
-     */
-    public function testKeepsInitializedPublicProperties(): void
-    {
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            BaseClass::class,
-            static function (
-                $proxy,
-                string $method,
-                array $parameters,
-                ?Closure & $initializer
-            ): bool {
-                $initializer           = null;
-                $proxy->publicProperty = 'newValue';
-
-                return true;
-            }
-        );
-
-        $proxy->initializeProxy();
-        self::assertSame('newValue', $proxy->publicProperty);
-
-        $proxy->publicProperty = 'otherValue';
-
-        $proxy->initializeProxy();
-
-        self::assertSame('otherValue', $proxy->publicProperty);
-    }
-
-    /**
-     * Verifies that properties' default values are preserved
-     */
-    public function testPublicPropertyDefaultWillBePreserved(): void
-    {
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            ClassWithPublicProperties::class,
-            static function (): bool {
-                return true;
-            }
-        );
-
-        self::assertSame('property0', $proxy->property0);
-    }
-
-    /**
-     * Verifies that protected properties' default values are preserved
-     */
-    public function testProtectedPropertyDefaultWillBePreserved(): void
-    {
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            ClassWithProtectedProperties::class,
-            static function (): bool {
-                return true;
-            }
-        );
-
-        // Check protected property via reflection
-        $reflectionProperty = new ReflectionProperty(ClassWithProtectedProperties::class, 'property0');
-        $reflectionProperty->setAccessible(true);
-
-        self::assertSame('property0', $reflectionProperty->getValue($proxy));
-    }
-
-    /**
-     * Verifies that private properties' default values are preserved
-     */
-    public function testPrivatePropertyDefaultWillBePreserved(): void
-    {
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            ClassWithPrivateProperties::class,
-            static function (): bool {
-                return true;
-            }
-        );
-
-        // Check protected property via reflection
-        $reflectionProperty = new ReflectionProperty(ClassWithPrivateProperties::class, 'property0');
-        $reflectionProperty->setAccessible(true);
-
-        self::assertSame('property0', $reflectionProperty->getValue($proxy));
-    }
-
-    /**
-     * @group 159
-     * @group 192
-     */
-    public function testMultiLevelPrivatePropertiesDefaultsWillBePreserved(): void
-    {
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            ClassWithCollidingPrivateInheritedProperties::class,
-            static function (): bool {
-                return true;
-            }
-        );
-
-        $childProperty  = new ReflectionProperty(ClassWithCollidingPrivateInheritedProperties::class, 'property0');
-        $parentProperty = new ReflectionProperty(get_parent_class(ClassWithCollidingPrivateInheritedProperties::class), 'property0');
-
-        $childProperty->setAccessible(true);
-        $parentProperty->setAccessible(true);
-
-        self::assertSame('childClassProperty0', $childProperty->getValue($proxy));
-        self::assertSame('property0', $parentProperty->getValue($proxy));
-    }
-
-    /**
-     * @group 159
-     * @group 192
-     */
-    public function testMultiLevelPrivatePropertiesByRefInitialization(): void
-    {
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            ClassWithCollidingPrivateInheritedProperties::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer,
-                array $properties
-            ): bool {
-                $initializer                                                                                              = null;
-                $properties["\0" . ClassWithCollidingPrivateInheritedProperties::class . "\0property0"]                   = 'foo';
-                $properties["\0" . get_parent_class(ClassWithCollidingPrivateInheritedProperties::class) . "\0property0"] = 'bar';
-
-                return true;
-            }
-        );
-
-        $childProperty  = new ReflectionProperty(ClassWithCollidingPrivateInheritedProperties::class, 'property0');
-        $parentProperty = new ReflectionProperty(get_parent_class(ClassWithCollidingPrivateInheritedProperties::class), 'property0');
-
-        $childProperty->setAccessible(true);
-        $parentProperty->setAccessible(true);
-
-        self::assertSame('foo', $childProperty->getValue($proxy));
-        self::assertSame('bar', $parentProperty->getValue($proxy));
-    }
-
-    /**
-     * @group 159
-     * @group 192
-     *
-     * Test designed to verify that the cached logic does take into account the fact that
-     * proxies are different instances
-     */
-    public function testGetPropertyFromDifferentProxyInstances(): void
-    {
-        $factory = new LazyLoadingGhostFactory();
-        $proxy1  = $factory->createProxy(
-            ClassWithCollidingPrivateInheritedProperties::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer,
-                array $properties
-            ): bool {
-                $initializer                                                                                              = null;
-                $properties["\0" . ClassWithCollidingPrivateInheritedProperties::class . "\0property0"]                   = 'foo';
-                $properties["\0" . get_parent_class(ClassWithCollidingPrivateInheritedProperties::class) . "\0property0"] = 'bar';
-
-                return true;
-            }
-        );
-        $proxy2  = $factory->createProxy(
-            ClassWithCollidingPrivateInheritedProperties::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer,
-                array $properties
-            ): bool {
-                $initializer                                                                                              = null;
-                $properties["\0" . ClassWithCollidingPrivateInheritedProperties::class . "\0property0"]                   = 'baz';
-                $properties["\0" . get_parent_class(ClassWithCollidingPrivateInheritedProperties::class) . "\0property0"] = 'tab';
-
-                return true;
-            }
-        );
-
-        $childProperty  = new ReflectionProperty(ClassWithCollidingPrivateInheritedProperties::class, 'property0');
-        $parentProperty = new ReflectionProperty(get_parent_class(ClassWithCollidingPrivateInheritedProperties::class), 'property0');
-
-        $childProperty->setAccessible(true);
-        $parentProperty->setAccessible(true);
-
-        self::assertSame('foo', $childProperty->getValue($proxy1));
-        self::assertSame('bar', $parentProperty->getValue($proxy1));
-
-        self::assertSame('baz', $childProperty->getValue($proxy2));
-        self::assertSame('tab', $parentProperty->getValue($proxy2));
-    }
-
-    /**
-     * @group 159
-     * @group 192
-     *
-     * Test designed to verify that the cached logic does take into account the fact that
-     * proxies are different instances
-     */
-    public function testSetPrivatePropertyOnDifferentProxyInstances(): void
-    {
-        $factory = new LazyLoadingGhostFactory();
-        $proxy1  = $factory->createProxy(
-            ClassWithMixedPropertiesAndAccessorMethods::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer
-            ): bool {
-                $initializer = null;
-
-                return true;
-            }
-        );
-        $proxy2  = $factory->createProxy(
-            ClassWithMixedPropertiesAndAccessorMethods::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer
-            ): bool {
-                $initializer = null;
-
-                return true;
-            }
-        );
-
-        $proxy1->set('privateProperty', 'private1');
-        $proxy2->set('privateProperty', 'private2');
-        self::assertSame('private1', $proxy1->get('privateProperty'));
-        self::assertSame('private2', $proxy2->get('privateProperty'));
-    }
-
-    /**
-     * @group 159
-     * @group 192
-     *
-     * Test designed to verify that the cached logic does take into account the fact that
-     * proxies are different instances
-     */
-    public function testIssetPrivatePropertyOnDifferentProxyInstances(): void
-    {
-        $factory = new LazyLoadingGhostFactory();
-        $proxy1  = $factory->createProxy(
-            ClassWithMixedPropertiesAndAccessorMethods::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer
-            ): bool {
-                $initializer = null;
-
-                return true;
-            }
-        );
-        $proxy2  = $factory->createProxy(
-            ClassWithMixedPropertiesAndAccessorMethods::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer,
-                array $properties
-            ): bool {
-                $initializer                                                                                = null;
-                $properties["\0" . ClassWithMixedPropertiesAndAccessorMethods::class . "\0privateProperty"] = null;
-
-                return true;
-            }
-        );
-
-        self::assertTrue($proxy1->has('privateProperty'));
-        self::assertFalse($proxy2->has('privateProperty'));
-        self::assertTrue($proxy1->has('privateProperty'));
-        self::assertFalse($proxy2->has('privateProperty'));
-    }
-
-    /**
-     * @group 159
-     * @group 192
-     *
-     * Test designed to verify that the cached logic does take into account the fact that
-     * proxies are different instances
-     */
-    public function testUnsetPrivatePropertyOnDifferentProxyInstances(): void
-    {
-        $factory = new LazyLoadingGhostFactory();
-        $proxy1  = $factory->createProxy(
-            ClassWithMixedPropertiesAndAccessorMethods::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer
-            ): bool {
-                $initializer = null;
-
-                return true;
-            }
-        );
-        $proxy2  = $factory->createProxy(
-            ClassWithMixedPropertiesAndAccessorMethods::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer
-            ): bool {
-                $initializer = null;
-
-                return true;
-            }
-        );
-
-        self::assertTrue($proxy1->has('privateProperty'));
-        $proxy2->remove('privateProperty');
-        self::assertFalse($proxy2->has('privateProperty'));
-        self::assertTrue($proxy1->has('privateProperty'));
-        $proxy1->remove('privateProperty');
-        self::assertFalse($proxy1->has('privateProperty'));
-        self::assertFalse($proxy2->has('privateProperty'));
-    }
-
-    /**
-     * @group 159
-     * @group 192
-     *
-     * Test designed to verify that the cached logic does take into account the fact that
-     * proxies are different instances
-     */
-    public function testIssetPrivateAndProtectedPropertiesDoesCheckAgainstBooleanFalse(): void
-    {
-        $factory = new LazyLoadingGhostFactory();
-        $proxy1  = $factory->createProxy(
-            ClassWithMixedPropertiesAndAccessorMethods::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer,
-                array $properties
-            ): bool {
-                $initializer                                                                                = null;
-                $properties['publicProperty']                                                               = false;
-                $properties["\0*\0protectedProperty"]                                                       = false;
-                $properties["\0" . ClassWithMixedPropertiesAndAccessorMethods::class . "\0privateProperty"] = false;
-
-                return true;
-            }
-        );
-        $proxy2  = $factory->createProxy(
-            ClassWithMixedPropertiesAndAccessorMethods::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer,
-                array $properties
-            ): bool {
-                $initializer                                                                                = null;
-                $properties['publicProperty']                                                               = null;
-                $properties["\0*\0protectedProperty"]                                                       = null;
-                $properties["\0" . ClassWithMixedPropertiesAndAccessorMethods::class . "\0privateProperty"] = null;
-
-                return true;
-            }
-        );
-
-        self::assertTrue($proxy1->has('protectedProperty'));
-        self::assertTrue($proxy1->has('publicProperty'));
-        self::assertTrue($proxy1->has('privateProperty'));
-
-        self::assertFalse($proxy2->has('protectedProperty'));
-        self::assertFalse($proxy2->has('publicProperty'));
-        self::assertFalse($proxy2->has('privateProperty'));
-    }
-
-    public function testByRefInitialization(): void
-    {
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            ClassWithMixedProperties::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer,
-                array $properties
-            ): bool {
-                $initializer                                                               = null;
-                $properties["\0" . ClassWithMixedProperties::class . "\0privateProperty0"] = 'private0';
-                $properties["\0" . ClassWithMixedProperties::class . "\0privateProperty1"] = 'private1';
-                $properties["\0" . ClassWithMixedProperties::class . "\0privateProperty2"] = 'private2';
-                $properties["\0*\0protectedProperty0"]                                     = 'protected0';
-                $properties["\0*\0protectedProperty1"]                                     = 'protected1';
-                $properties["\0*\0protectedProperty2"]                                     = 'protected2';
-                $properties['publicProperty0']                                             = 'public0';
-                $properties['publicProperty1']                                             = 'public1';
-                $properties['publicProperty2']                                             = 'public2';
-
-                return true;
-            }
-        );
-
-        $reflectionClass = new ReflectionClass(ClassWithMixedProperties::class);
-
-        foreach (Properties::fromReflectionClass($reflectionClass)->getInstanceProperties() as $property) {
-            $property->setAccessible(true);
-
-            self::assertSame(str_replace('Property', '', $property->getName()), $property->getValue($proxy));
-        }
-    }
-
-    /**
-     * @requires PHP 7.4
-     */
-    public function testByRefInitializationOfTypedProperties(): void
-    {
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            ClassWithMixedTypedProperties::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer,
-                array $properties
-            ): bool {
-                $initializer                                                                         = null;
-                $properties["\0" . ClassWithMixedTypedProperties::class . "\0privateStringProperty"] = 'private0';
-                $properties["\0*\0protectedStringProperty"]                                          = 'protected0';
-                $properties['publicStringProperty']                                                  = 'public0';
-
-                return true;
-            }
-        );
-
-        $reflectionClass = new ReflectionClass(ClassWithMixedTypedProperties::class);
-
-        $properties = Properties::fromReflectionClass($reflectionClass)->getInstanceProperties();
-
-        $privateProperty   = $properties["\0" . ClassWithMixedTypedProperties::class . "\0privateStringProperty"];
-        $protectedProperty = $properties["\0*\0protectedStringProperty"];
-
-        $privateProperty->setAccessible(true);
-        $protectedProperty->setAccessible(true);
-
-        self::assertSame('private0', $privateProperty->getValue($proxy));
-        self::assertSame('protected0', $properties["\0*\0protectedStringProperty"]->getValue($proxy));
-        self::assertSame('public0', $proxy->publicStringProperty);
-    }
-
-    /**
-     * @requires PHP 8.1
-     */
-    public function testInitializationOfReadOnlyProperties(): void
-    {
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            ClassWithReadOnlyProperties::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer,
-                array $properties
-            ): bool {
-                $initializer                                                           = null;
-                $properties["\0" . ClassWithReadOnlyProperties::class . "\0property2"] = 'private0';
-                $properties["\0*\0property1"]                                          = 'protected0';
-                $properties['property0']                                               = 'public0';
-
-                return true;
-            }
-        );
-
-        $reflectionClass = new ReflectionClass(ClassWithReadOnlyProperties::class);
-
-        $properties = Properties::fromReflectionClass($reflectionClass)->getInstanceProperties();
-
-        $privateProperty   = $properties["\0" . ClassWithReadOnlyProperties::class . "\0property2"];
-        $protectedProperty = $properties["\0*\0property1"];
-
-        $privateProperty->setAccessible(true);
-        $protectedProperty->setAccessible(true);
-
-        self::assertSame('private0', $privateProperty->getValue($proxy));
-        self::assertSame('protected0', $properties["\0*\0property1"]->getValue($proxy));
-        self::assertSame('public0', $proxy->property0);
-    }
-
-    /**
-     * @group 115
-     * @group 175
-     */
-    public function testWillBehaveLikeObjectWithNormalConstructor(): void
-    {
-        $instance = new ClassWithCounterConstructor(10);
-
-        self::assertSame(10, $instance->amount, 'Verifying that test asset works as expected');
-        self::assertSame(10, $instance->getAmount(), 'Verifying that test asset works as expected');
-        $instance->__construct(3);
-        self::assertSame(13, $instance->amount, 'Verifying that test asset works as expected');
-        self::assertSame(13, $instance->getAmount(), 'Verifying that test asset works as expected');
-
-        $proxyName = get_class(
-            (new LazyLoadingGhostFactory())
-                ->createProxy(
-                    ClassWithCounterConstructor::class,
-                    static function (): bool {
-                        return true;
-                    }
-                )
-        );
-
-        /** @psalm-suppress UnsafeInstantiation it is allowed (by design) to instantiate these proxies */
-        $proxy = new $proxyName(15);
-
-        self::assertSame(15, $proxy->amount, 'Verifying that the proxy constructor works as expected');
-        self::assertSame(15, $proxy->getAmount(), 'Verifying that the proxy constructor works as expected');
-        $proxy->__construct(5);
-        self::assertSame(20, $proxy->amount, 'Verifying that the proxy constructor works as expected');
-        self::assertSame(20, $proxy->getAmount(), 'Verifying that the proxy constructor works as expected');
-    }
-
-    /**
-     * @requires PHP 7.4
-     */
-    public function testInitializeProxyWillReturnTrueOnSuccessfulInitialization(): void
-    {
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            ClassWithMixedTypedProperties::class,
-            $this->createInitializer(
-                ClassWithMixedTypedProperties::class,
-                new ClassWithMixedTypedProperties()
-            )
-        );
-
-        self::assertTrue($proxy->initializeProxy());
-        self::assertTrue($proxy->isProxyInitialized());
-        self::assertFalse($proxy->initializeProxy());
-    }
-
-    /**
-     * @psalm-param (CallableInterface&Mock)|null $initializerMatcher
-     *
-     * @psalm-return Closure(
-     *   GhostObjectInterface,
-     *   string,
-     *   array,
-     *   ?Closure
-     * ) : bool
-     */
-    private function createInitializer(string $className, $realInstance, ?Mock $initializerMatcher = null): Closure
-    {
-        if (! $initializerMatcher) {
-            $initializerMatcher = $this->createMock(CallableInterface::class);
-
-            $initializerMatcher
-                ->expects(self::once())
-                ->method('__invoke')
-                ->with(self::logicalAnd(
-                    self::isInstanceOf(GhostObjectInterface::class),
-                    self::isInstanceOf($className)
-                ));
-        }
-
-        return static function (
-            GhostObjectInterface $proxy,
-            string $method,
-            array $params,
-            ?Closure & $initializer
-        ) use (
-            $initializerMatcher,
-            $realInstance
-        ): bool {
-            $initializer = null;
-
-            $reflectionClass = new ReflectionClass($realInstance);
-
-            foreach (Properties::fromReflectionClass($reflectionClass)->getInstanceProperties() as $property) {
-                if (! self::isPropertyInitialized($realInstance, $property)) {
-                    continue;
-                }
-
-                $property->setAccessible(true);
-                $property->setValue($proxy, $property->getValue($realInstance));
-            }
-
-            $initializerMatcher->__invoke($proxy, $method, $params);
-
-            return true;
-        };
-    }
-
-    /**
-     * Generates a list of object | invoked method | parameters | expected result
-     *
-     * @return null[][]|string[][]|object[][]|mixed[][][]
-     */
-    public function getProxyMethods(): array
-    {
-        $selfHintParam = new ClassWithSelfHint();
-        $empty         = new EmptyClass();
-
-        return [
-            [
-                BaseClass::class,
-                new BaseClass(),
-                'publicMethod',
-                [],
-                'publicMethodDefault',
-            ],
-            [
-                BaseClass::class,
-                new BaseClass(),
-                'publicTypeHintedMethod',
-                [new stdClass()],
-                'publicTypeHintedMethodDefault',
-            ],
-            [
-                BaseClass::class,
-                new BaseClass(),
-                'publicByReferenceMethod',
-                [],
-                'publicByReferenceMethodDefault',
-            ],
-            [
-                ClassWithSelfHint::class,
-                new ClassWithSelfHint(),
-                'selfHintMethod',
-                ['parameter' => $selfHintParam],
-                $selfHintParam,
-            ],
-            [
-                ClassWithParentHint::class,
-                new ClassWithParentHint(),
-                'parentHintMethod',
-                ['parameter' => $empty],
-                $empty,
-            ],
-            [
-                ClassWithAbstractPublicMethod::class,
-                new EmptyClass(), // EmptyClass just used to not make reflection explode when synchronizing properties
-                'publicAbstractMethod',
-                [],
-                null,
-            ],
-            [
-                ClassWithMethodWithByRefVariadicFunction::class,
-                new ClassWithMethodWithByRefVariadicFunction(),
-                'tuz',
-                ['Ocramius', 'Malukenho'],
-                ['Ocramius', 'changed'],
-            ],
-        ];
-    }
-
-    /**
-     * Generates a list of object | invoked method | parameters | expected result for methods that cause lazy-loading
-     * of a ghost object
-     *
-     * @return string[][]|object[][]|mixed[][][]|null[][]
-     */
-    public function getProxyInitializingMethods(): array
-    {
-        return [
-            [
-                BaseClass::class,
-                new BaseClass(),
-                'publicPropertyGetter',
-                [],
-                'publicPropertyDefault',
-            ],
-            [
-                BaseClass::class,
-                new BaseClass(),
-                'protectedPropertyGetter',
-                [],
-                'protectedPropertyDefault',
-            ],
-            [
-                BaseClass::class,
-                new BaseClass(),
-                'privatePropertyGetter',
-                [],
-                'privatePropertyDefault',
-            ],
-            [
-                ClassWithMethodWithVariadicFunction::class,
-                new ClassWithMethodWithVariadicFunction(),
-                'foo',
-                ['Ocramius', 'Malukenho'],
-                null,
-            ],
-        ];
-    }
-
-    /**
-     * Generates a list of object | invoked method | parameters | expected result for methods DON'T cause lazy-loading
-     *
-     * @return null[][]|string[][]|object[][]|mixed[][][]
-     */
-    public function getProxyNonInitializingMethods(): array
-    {
-        return $this->getProxyMethods();
-    }
-
-    /**
-     * Generates proxies and instances with a public property to feed to the property accessor methods
-     *
-     * @return string[][]|object[][]
-     */
-    public function getPropertyAccessProxies(): array
-    {
-        $instance1             = new BaseClass();
-        $instance2             = new BaseClass();
-
-        $factory = new LazyLoadingGhostFactory();
-
-        $serialized = unserialize(serialize($factory->createProxy(
-            BaseClass::class,
-            $this->createInitializer(BaseClass::class, $instance2)
-        )));
-        assert($serialized instanceof GhostObjectInterface);
-
-        $tests = [
-            [
-                $instance1,
-                $factory->createProxy(
-                    BaseClass::class,
-                    $this->createInitializer(BaseClass::class, $instance1)
-                ),
-                'publicProperty',
-                'publicPropertyDefault',
-            ],
-            [
-                $instance2,
-                $serialized,
-                'publicProperty',
-                'publicPropertyDefault',
-            ],
-        ];
-
-        if (\PHP_VERSION_ID < 70400) {
-            return $tests;
-        }
-
-        $typedProperty         = new ClassWithPublicStringTypedProperty();
-        $typedNullableProperty = new ClassWithPublicStringNullableTypedProperty();
-
-        $typedProperty->typedProperty                 = 'Typed property initialized value';
-        $typedNullableProperty->typedNullableProperty = 'Typed nullable property initialized value';
-
-        return array_merge($tests, [
-            [
-                $typedProperty,
-                $factory->createProxy(
-                    ClassWithPublicStringTypedProperty::class,
-                    $this->createInitializer(ClassWithPublicStringTypedProperty::class, $typedProperty)
-                ),
-                'typedProperty',
-                'Typed property initialized value',
-            ],
-            [
-                $typedNullableProperty,
-                $factory->createProxy(
-                    ClassWithPublicStringNullableTypedProperty::class,
-                    $this->createInitializer(ClassWithPublicStringNullableTypedProperty::class, $typedNullableProperty)
-                ),
-                'typedNullableProperty',
-                'Typed nullable property initialized value',
-            ],
-        ]);
-    }
-
-    /**
-     * @param mixed[] $proxyOptions
-     * @psalm-param class-string $className
-     * @psalm-param array{skippedProperties?: array<int, string>} $proxyOptions
-     *
-     * @dataProvider skipPropertiesFixture
-     */
-    public function testInitializationIsSkippedForSkippedProperties(
-        string $className,
-        string $propertyClass,
-        string $propertyName,
-        array $proxyOptions,
-        $expected
-    ): void {
-        $ghostObject = (new LazyLoadingGhostFactory())->createProxy(
-            $className,
-            static function () use ($propertyName): bool {
-                self::fail(sprintf('The Property "%s" was not expected to be lazy-loaded', $propertyName));
-
-                return true;
-            },
-            $proxyOptions
-        );
-
-        $property = new ReflectionProperty($propertyClass, $propertyName);
-        $property->setAccessible(true);
-
-        self::assertSame($expected, $property->getValue($ghostObject));
-    }
-
-    /**
-     * @param array<string, mixed> $proxyOptions
-     * @psalm-param class-string $className
-     * @psalm-param array{skippedProperties?: array<int, string>} $proxyOptions
-     *
-     * @dataProvider skipPropertiesFixture
-     */
-    public function testSkippedPropertiesAreNotOverwrittenOnInitialization(
-        string $className,
-        string $propertyClass,
-        string $propertyName,
-        array $proxyOptions
-    ): void {
-        $ghostObject = (new LazyLoadingGhostFactory())->createProxy(
-            $className,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer
-            ): bool {
-                $initializer = null;
-
-                return true;
-            },
-            $proxyOptions
-        );
-
-        $property = new ReflectionProperty($propertyClass, $propertyName);
-
-        $property->setAccessible(true);
-
-        $value = uniqid('', true);
-
-        $property->setValue($ghostObject, $value);
-
-        self::assertTrue($ghostObject->initializeProxy());
-
-        self::assertSame(
-            $value,
-            $property->getValue($ghostObject),
-            'Property should not be changed by proxy initialization'
-        );
-    }
-
-    /**
-     * @group 265
-     */
-    public function testWillForwardVariadicByRefArguments(): void
-    {
-        $object = (new LazyLoadingGhostFactory())->createProxy(
-            ClassWithMethodWithByRefVariadicFunction::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer
-            ): bool {
-                $initializer = null;
-
-                return true;
-            }
-        );
-
-        $parameters = ['a', 'b', 'c'];
-
-        // first, testing normal variadic behavior (verifying we didn't screw up in the test asset)
-        self::assertSame(['a', 'changed', 'c'], (new ClassWithMethodWithByRefVariadicFunction())->tuz(...$parameters));
-        self::assertSame(['a', 'changed', 'c'], $object->tuz(...$parameters));
-        self::assertSame(['a', 'changed', 'c'], $parameters, 'by-ref variadic parameter was changed');
-    }
-
-    /**
-     * @group 265
-     */
-    public function testWillForwardDynamicArguments(): void
-    {
-        $object = (new LazyLoadingGhostFactory())->createProxy(
-            ClassWithDynamicArgumentsMethod::class,
-            static function (): bool {
-                return true;
-            }
-        );
-
-        // first, testing normal variadic behavior (verifying we didn't screw up in the test asset)
-        self::assertSame(['a', 'b'], (new ClassWithDynamicArgumentsMethod())->dynamicArgumentsMethod('a', 'b'));
-        self::assertSame(['a', 'b'], $object->dynamicArgumentsMethod('a', 'b'));
-    }
-
-    /**
-     * @return mixed[] in order:
-     *                  - the class to be proxied
-     *                  - the class owning the property to be checked
-     *                  - the property name
-     *                  - the options to be passed to the generator
-     *                  - the expected value of the property
-     */
-    public function skipPropertiesFixture(): array
-    {
-        return [
-            [
-                ClassWithPublicProperties::class,
-                ClassWithPublicProperties::class,
-                'property9',
-                [
-                    'skippedProperties' => ['property9'],
-                ],
-                'property9',
-            ],
-            [
-                ClassWithProtectedProperties::class,
-                ClassWithProtectedProperties::class,
-                'property9',
-                [
-                    'skippedProperties' => ["\0*\0property9"],
-                ],
-                'property9',
-            ],
-            [
-                ClassWithPrivateProperties::class,
-                ClassWithPrivateProperties::class,
-                'property9',
-                [
-                    'skippedProperties' => ["\0ProxyManagerTestAsset\\ClassWithPrivateProperties\0property9"],
-                ],
-                'property9',
-            ],
-            [
-                ClassWithCollidingPrivateInheritedProperties::class,
-                ClassWithCollidingPrivateInheritedProperties::class,
-                'property0',
-                [
-                    'skippedProperties' => ["\0ProxyManagerTestAsset\\ClassWithCollidingPrivateInheritedProperties\0property0"],
-                ],
-                'childClassProperty0',
-            ],
-            [
-                ClassWithCollidingPrivateInheritedProperties::class,
-                ClassWithPrivateProperties::class,
-                'property0',
-                [
-                    'skippedProperties' => ["\0ProxyManagerTestAsset\\ClassWithPrivateProperties\0property0"],
-                ],
-                'property0',
-            ],
-        ];
-    }
-
-    /**
-     * @group        276
-     * @dataProvider getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope
-     * @psalm-suppress UnusedVariable this method uses by-ref assignment of properties, and isn't recognized by static analysis
-     */
-    public function testWillLazyLoadMembersOfOtherProxiesWithTheSamePrivateScope(
-        $callerObject,
-        string $method,
-        string $propertyIndex,
-        string $expectedValue
-    ): void {
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            OtherObjectAccessClass::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer,
-                array $properties
-            ) use (
-                $propertyIndex,
-                $expectedValue
-            ): bool {
-                $initializer = null;
-
-                $properties[$propertyIndex] = $expectedValue;
-
-                return true;
-            }
-        );
-
-        $accessor = [$callerObject, $method];
-
-        self::assertIsCallable($accessor);
-
-        self::assertFalse($proxy->isProxyInitialized());
-        self::assertSame($expectedValue, $accessor($proxy));
-        self::assertTrue($proxy->isProxyInitialized());
-    }
-
-    /**
-     * @group        276
-     * @dataProvider getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope
-     * @psalm-suppress UnusedVariable this method uses by-ref assignment of properties, and isn't recognized by static analysis
-     */
-    public function testWillAccessMembersOfOtherDeSerializedProxiesWithTheSamePrivateScope(
-        $callerObject,
-        string $method,
-        string $propertyIndex,
-        string $expectedValue
-    ): void {
-        $proxy = unserialize(serialize(
-            (new LazyLoadingGhostFactory())->createProxy(
-                OtherObjectAccessClass::class,
-                static function (
-                    GhostObjectInterface $proxy,
-                    string $method,
-                    array $params,
-                    ?Closure & $initializer,
-                    array $properties
-                ) use (
-                    $propertyIndex,
-                    $expectedValue
-                ): bool {
-                    $initializer = null;
-                    assert($proxy instanceof OtherObjectAccessClass && $proxy instanceof LazyLoadingInterface);
-
-                    $properties[$propertyIndex] = $expectedValue;
-
-                    return true;
-                }
-            )
-        ));
-
-        self::assertInstanceOf(GhostObjectInterface::class, $proxy);
-
-        $accessor = [$callerObject, $method];
-
-        self::assertIsCallable($accessor);
-
-        self::assertTrue($proxy->isProxyInitialized());
-        self::assertSame($expectedValue, $accessor($proxy));
-    }
-
-    /**
-     * @group        276
-     * @dataProvider getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope
-     * @psalm-suppress UnusedVariable this method uses by-ref assignment of properties, and isn't recognized by static analysis
-     */
-    public function testWillAccessMembersOfOtherClonedProxiesWithTheSamePrivateScope(
-        $callerObject,
-        string $method,
-        string $propertyIndex,
-        string $expectedValue
-    ): void {
-        $proxy = clone (new LazyLoadingGhostFactory())->createProxy(
-            OtherObjectAccessClass::class,
-            static function (
-                GhostObjectInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer,
-                array $properties
-            ) use (
-                $propertyIndex,
-                $expectedValue
-            ): bool {
-                $initializer = null;
-
-                $properties[$propertyIndex] = $expectedValue;
-
-                return true;
-            }
-        );
-
-        $accessor = [$callerObject, $method];
-
-        self::assertIsCallable($accessor);
-
-        self::assertTrue($proxy->isProxyInitialized());
-        self::assertSame($expectedValue, $accessor($proxy));
-    }
-
-    /** @return string[][]|object[][] */
-    public function getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope(): array
-    {
-        $factory = new LazyLoadingGhostFactory();
-
-        return [
-            OtherObjectAccessClass::class . '#$privateProperty'                => [
-                new OtherObjectAccessClass(),
-                'getPrivateProperty',
-                "\0" . OtherObjectAccessClass::class . "\0privateProperty",
-                uniqid('', true),
-            ],
-            OtherObjectAccessClass::class . '#$protectedProperty'              => [
-                new OtherObjectAccessClass(),
-                'getProtectedProperty',
-                "\0*\0protectedProperty",
-                uniqid('', true),
-            ],
-            OtherObjectAccessClass::class . '#$publicProperty'                 => [
-                new OtherObjectAccessClass(),
-                'getPublicProperty',
-                'publicProperty',
-                uniqid('', true),
-            ],
-            '(proxy) ' . OtherObjectAccessClass::class . '#$privateProperty'   => [
-                $factory->createProxy(
-                    OtherObjectAccessClass::class,
-                    static function (): bool {
-                        self::fail('Should never be initialized, as its values aren\'t accessed');
-
-                        return true;
-                    }
-                ),
-                'getPrivateProperty',
-                "\0" . OtherObjectAccessClass::class . "\0privateProperty",
-                uniqid('', true),
-            ],
-            '(proxy) ' . OtherObjectAccessClass::class . '#$protectedProperty' => [
-                $factory->createProxy(
-                    OtherObjectAccessClass::class,
-                    static function (): bool {
-                        self::fail('Should never be initialized, as its values aren\'t accessed');
-
-                        return true;
-                    }
-                ),
-                'getProtectedProperty',
-                "\0*\0protectedProperty",
-                uniqid('', true),
-            ],
-            '(proxy) ' . OtherObjectAccessClass::class . '#$publicProperty'    => [
-                $factory->createProxy(
-                    OtherObjectAccessClass::class,
-                    static function (): bool {
-                        self::fail('Should never be initialized, as its values aren\'t accessed');
-
-                        return true;
-                    }
-                ),
-                'getPublicProperty',
-                'publicProperty',
-                uniqid('', true),
-            ],
-        ];
-    }
-
-    /**
-     * @group 276
-     */
-    public function testFriendObjectWillNotCauseLazyLoadingOnSkippedProperty(): void
-    {
-        $proxy = (new LazyLoadingGhostFactory())
-            ->createProxy(
-                OtherObjectAccessClass::class,
-                static function (): bool {
-                    throw new BadMethodCallException('The proxy should never be initialized, as all properties are skipped');
-                },
-                [
-                    'skippedProperties' => [
-                        "\0" . OtherObjectAccessClass::class . "\0privateProperty",
-                        "\0*\0protectedProperty",
-                        'publicProperty',
-                    ],
-                ]
-            );
-
-        $privatePropertyValue   = uniqid('', true);
-        $protectedPropertyValue = uniqid('', true);
-        $publicPropertyValue    = uniqid('', true);
-
-        $reflectionPrivateProperty = new ReflectionProperty(OtherObjectAccessClass::class, 'privateProperty');
-
-        $reflectionPrivateProperty->setAccessible(true);
-        $reflectionPrivateProperty->setValue($proxy, $privatePropertyValue);
-
-        $reflectionProtectedProperty = new ReflectionProperty(OtherObjectAccessClass::class, 'protectedProperty');
-
-        $reflectionProtectedProperty->setAccessible(true);
-        $reflectionProtectedProperty->setValue($proxy, $protectedPropertyValue);
-
-        $proxy->publicProperty = $publicPropertyValue;
-
-        $friendObject = new OtherObjectAccessClass();
-
-        self::assertSame($privatePropertyValue, $friendObject->getPrivateProperty($proxy));
-        self::assertSame($protectedPropertyValue, $friendObject->getProtectedProperty($proxy));
-        self::assertSame($publicPropertyValue, $friendObject->getPublicProperty($proxy));
-    }
-
-    public function testClonedSkippedPropertiesArePreserved(): void
-    {
-        $proxy = (new LazyLoadingGhostFactory())
-            ->createProxy(
-                BaseClass::class,
-                static function (GhostObjectInterface $proxy): bool {
-                    $proxy->setProxyInitializer(null);
-
-                    return true;
-                },
-                [
-                    'skippedProperties' => [
-                        "\0" . BaseClass::class . "\0privateProperty",
-                        "\0*\0protectedProperty",
-                        'publicProperty',
-                    ],
-                ]
-            );
-
-        $reflectionPrivate   = new ReflectionProperty(BaseClass::class, 'privateProperty');
-        $reflectionProtected = new ReflectionProperty(BaseClass::class, 'protectedProperty');
-
-        $reflectionPrivate->setAccessible(true);
-        $reflectionProtected->setAccessible(true);
-
-        $privateValue   = uniqid('', true);
-        $protectedValue = uniqid('', true);
-        $publicValue    = uniqid('', true);
-
-        $reflectionPrivate->setValue($proxy, $privateValue);
-        $reflectionProtected->setValue($proxy, $protectedValue);
-        $proxy->publicProperty = $publicValue;
-
-        self::assertFalse($proxy->isProxyInitialized());
-
-        $clone = clone $proxy;
-
-        self::assertFalse($proxy->isProxyInitialized());
-        self::assertTrue($clone->isProxyInitialized());
-
-        self::assertSame($privateValue, $reflectionPrivate->getValue($proxy));
-        self::assertSame($privateValue, $reflectionPrivate->getValue($clone));
-        self::assertSame($protectedValue, $reflectionProtected->getValue($proxy));
-        self::assertSame($protectedValue, $reflectionProtected->getValue($clone));
-        self::assertSame($publicValue, $proxy->publicProperty);
-        self::assertSame($publicValue, $clone->publicProperty);
-    }
-
-    /**
-     * @group 327
-     * @psalm-suppress UnusedVariable this method uses by-ref assignment of properties, and isn't recognized by static analysis
-     */
-    public function testWillExecuteLogicInAVoidMethod(): void
-    {
-        $initialCounter = random_int(10, 1000);
-
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            VoidCounter::class,
-            static function (
-                LazyLoadingInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer,
-                array $properties
-            ) use ($initialCounter): bool {
-                $initializer = null;
-
-                $properties['counter'] = $initialCounter;
-
-                return true;
-            }
-        );
-
-        $increment = random_int(1001, 10000);
-
-        $proxy->increment($increment);
-
-        self::assertSame($initialCounter + $increment, $proxy->counter);
-    }
-
-    /**
-     * @requires PHP 8.1
-     *
-     * @psalm-suppress UnusedVariable this method uses by-ref assignment of properties, and isn't recognized by static analysis
-     * @psalm-suppress UndefinedClass Class, interface or enum named never does not exist
-     */
-    public function testWillExecuteLogicInANeverMethod(): void
-    {
-        $initialCounter = random_int(10, 1000);
-
-        $proxy = (new LazyLoadingGhostFactory())->createProxy(
-            NeverCounter::class,
-            static function (
-                LazyLoadingInterface $proxy,
-                string $method,
-                array $params,
-                ?Closure & $initializer,
-                array $properties
-            ) use ($initialCounter): bool {
-                $initializer = null;
-
-                $properties['counter'] = $initialCounter;
-
-                return true;
-            }
-        );
-
-        $increment = random_int(1001, 10000);
-
-        try {
-            $proxy->increment($increment);
-            $this->fail('RuntimeException expected');
-        } catch (RuntimeException $e) {
-            // Nothing to do
-        }
-
-        self::assertSame($initialCounter + $increment, $proxy->counter);
-    }
-
-    private static function isPropertyInitialized($object, ReflectionProperty $property): bool
-    {
-        return array_key_exists(
-            ($property->isProtected() ? "\0*\0" : '')
-            . ($property->isPrivate() ? "\0" . $property->getDeclaringClass()->getName() . "\0" : '')
-            . $property->getName(),
-            (array) $object
-        );
-    }
-
-    private static function assertByRefVariableValueSame($expected, & $actual): void
-    {
-        self::assertSame($expected, $actual);
-    }
-}
diff --git a/tests/ProxyManagerTest/Functional/LazyLoadingValueHolderFunctionalTest.php b/tests/ProxyManagerTest/Functional/LazyLoadingValueHolderFunctionalTest.php
deleted file mode 100644
index a840c20..0000000
--- a/tests/ProxyManagerTest/Functional/LazyLoadingValueHolderFunctionalTest.php
+++ /dev/null
@@ -1,774 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\Functional;
-
-use Closure;
-use Generator;
-use PHPUnit\Framework\ExpectationFailedException;
-use PHPUnit\Framework\MockObject\MockObject as Mock;
-use PHPUnit\Framework\TestCase;
-use ProxyManager\Factory\LazyLoadingValueHolderFactory;
-use ProxyManager\Proxy\LazyLoadingInterface;
-use ProxyManager\Proxy\VirtualProxyInterface;
-use ProxyManagerTestAsset\BaseClass;
-use ProxyManagerTestAsset\BaseInterface;
-use ProxyManagerTestAsset\CallableInterface;
-use ProxyManagerTestAsset\ClassWithCounterConstructor;
-use ProxyManagerTestAsset\ClassWithDynamicArgumentsMethod;
-use ProxyManagerTestAsset\ClassWithMagicMethods;
-use ProxyManagerTestAsset\ClassWithMethodWithByRefVariadicFunction;
-use ProxyManagerTestAsset\ClassWithMethodWithVariadicFunction;
-use ProxyManagerTestAsset\ClassWithParentHint;
-use ProxyManagerTestAsset\ClassWithPublicArrayProperty;
-use ProxyManagerTestAsset\ClassWithPublicProperties;
-use ProxyManagerTestAsset\ClassWithPublicStringNullableTypedProperty;
-use ProxyManagerTestAsset\ClassWithPublicStringTypedProperty;
-use ProxyManagerTestAsset\ClassWithSelfHint;
-use ProxyManagerTestAsset\EmptyClass;
-use ProxyManagerTestAsset\NeverCounter;
-use ProxyManagerTestAsset\OtherObjectAccessClass;
-use ProxyManagerTestAsset\VoidCounter;
-use ReflectionClass;
-use ReflectionProperty;
-use RuntimeException;
-use stdClass;
-
-use function array_values;
-use function assert;
-use function get_class;
-use function is_callable;
-use function random_int;
-use function serialize;
-use function ucfirst;
-use function uniqid;
-use function unserialize;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator} produced objects
- *
- * @group Functional
- * @coversNothing
- */
-final class LazyLoadingValueHolderFunctionalTest extends TestCase
-{
-    /**
-     * @param mixed[] $params
-     * @psalm-param class-string<OriginalClass> $className
-     * @psalm-param OriginalClass $instance
-     *
-     * @dataProvider getProxyMethods
-     * @psalm-template OriginalClass
-     */
-    public function testMethodCalls(string $className, $instance, string $method, array $params, $expectedValue): void
-    {
-        $proxy = (new LazyLoadingValueHolderFactory())->createProxy(
-            $className,
-            $this->createInitializer($className, $instance)
-        );
-
-        self::assertFalse($proxy->isProxyInitialized());
-
-        $callProxyMethod = [$proxy, $method];
-        assert(is_callable($callProxyMethod));
-        $parameterValues = array_values($params);
-
-        self::assertSame($expectedValue, $callProxyMethod(...$parameterValues));
-        self::assertTrue($proxy->isProxyInitialized());
-        self::assertSame($instance, $proxy->getWrappedValueHolderValue());
-    }
-
-    /**
-     * @param mixed[] $params
-     * @psalm-param class-string<OriginalClass> $className
-     * @psalm-param OriginalClass $instance
-     *
-     * @dataProvider getProxyMethods
-     * @psalm-template OriginalClass
-     */
-    public function testMethodCallsAfterUnSerialization(
-        string $className,
-        $instance,
-        string $method,
-        array $params,
-        $expectedValue
-    ): void {
-        $proxy = unserialize(serialize((new LazyLoadingValueHolderFactory())->createProxy(
-            $className,
-            $this->createInitializer($className, $instance)
-        )));
-        assert($proxy instanceof VirtualProxyInterface);
-
-        self::assertTrue($proxy->isProxyInitialized());
-
-        $callProxyMethod = [$proxy, $method];
-        $parameterValues = array_values($params);
-
-        self::assertIsCallable($callProxyMethod);
-
-        self::assertSame($expectedValue, $callProxyMethod(...$parameterValues));
-        self::assertEquals($instance, $proxy->getWrappedValueHolderValue());
-    }
-
-    /**
-     * @param mixed[] $params
-     * @psalm-param class-string<OriginalClass> $className
-     * @psalm-param OriginalClass $instance
-     *
-     * @dataProvider getProxyMethods
-     * @psalm-template OriginalClass
-     */
-    public function testMethodCallsAfterCloning(
-        string $className,
-        $instance,
-        string $method,
-        array $params,
-        $expectedValue
-    ): void {
-        $proxy  = (new LazyLoadingValueHolderFactory())->createProxy(
-            $className,
-            $this->createInitializer($className, $instance)
-        );
-        $cloned = clone $proxy;
-
-        self::assertTrue($cloned->isProxyInitialized());
-        self::assertNotSame($proxy->getWrappedValueHolderValue(), $cloned->getWrappedValueHolderValue());
-
-        $callProxyMethod = [$cloned, $method];
-        $parameterValues = array_values($params);
-
-        self::assertIsCallable($callProxyMethod);
-
-        self::assertSame($expectedValue, $callProxyMethod(...$parameterValues));
-        self::assertEquals($instance, $cloned->getWrappedValueHolderValue());
-    }
-
-    /**
-     * @dataProvider getPropertyAccessProxies
-     */
-    public function testPropertyReadAccess(
-        $instance,
-        VirtualProxyInterface $proxy,
-        string $publicProperty,
-        $propertyValue
-    ): void {
-        self::assertSame($propertyValue, $proxy->$publicProperty);
-        self::assertTrue($proxy->isProxyInitialized());
-        self::assertEquals($instance, $proxy->getWrappedValueHolderValue());
-    }
-
-    /**
-     * @dataProvider getPropertyAccessProxies
-     */
-    public function testPropertyWriteAccess($instance, VirtualProxyInterface $proxy, string $publicProperty): void
-    {
-        $newValue               = uniqid('', true);
-        $proxy->$publicProperty = $newValue;
-
-        self::assertTrue($proxy->isProxyInitialized());
-        self::assertSame($newValue, $proxy->$publicProperty);
-
-        $wrappedValue = $proxy->getWrappedValueHolderValue();
-
-        self::assertNotNull($wrappedValue);
-
-        self::assertSame($newValue, $wrappedValue->$publicProperty);
-    }
-
-    /**
-     * @dataProvider getPropertyAccessProxies
-     */
-    public function testPropertyExistence($instance, VirtualProxyInterface $proxy, string $publicProperty): void
-    {
-        self::assertSame(isset($instance->$publicProperty), isset($proxy->$publicProperty));
-        self::assertTrue($proxy->isProxyInitialized());
-        self::assertEquals($instance, $proxy->getWrappedValueHolderValue());
-    }
-
-    /**
-     * @dataProvider getPropertyAccessProxies
-     */
-    public function testPropertyAbsence($instance, VirtualProxyInterface $proxy, string $publicProperty): void
-    {
-        $propertyType = \PHP_VERSION_ID >= 70400 ? (new ReflectionProperty($instance, $publicProperty))->getType() : null;
-
-        if ($propertyType !== null && ! $propertyType->allowsNull()) {
-            self::markTestSkipped('Non-nullable typed properties cannot be removed/unset');
-        }
-
-        $instance                  = $proxy->getWrappedValueHolderValue() ?? $instance;
-        $instance->$publicProperty = null;
-        self::assertFalse(isset($proxy->$publicProperty));
-        self::assertTrue($proxy->isProxyInitialized());
-    }
-
-    /**
-     * @dataProvider getPropertyAccessProxies
-     */
-    public function testPropertyUnset($instance, VirtualProxyInterface $proxy, string $publicProperty): void
-    {
-        $instance = $proxy->getWrappedValueHolderValue() ?? $instance;
-        unset($proxy->$publicProperty);
-
-        self::assertTrue($proxy->isProxyInitialized());
-
-        self::assertFalse(isset($instance->$publicProperty));
-        self::assertFalse(isset($proxy->$publicProperty));
-    }
-
-    /**
-     * Verifies that accessing a public property containing an array behaves like in a normal context
-     */
-    public function testCanWriteToArrayKeysInPublicProperty(): void
-    {
-        $proxy = (new LazyLoadingValueHolderFactory())->createProxy(
-            ClassWithPublicArrayProperty::class,
-            $this->createInitializer(ClassWithPublicArrayProperty::class, new ClassWithPublicArrayProperty())
-        );
-
-        $proxy->arrayProperty['foo'] = 'bar';
-
-        self::assertByRefVariableValueSame('bar', $proxy->arrayProperty['foo']);
-
-        $proxy->arrayProperty = ['tab' => 'taz'];
-
-        self::assertSame(['tab' => 'taz'], $proxy->arrayProperty);
-    }
-
-    /**
-     * Verifies that public properties retrieved via `__get` don't get modified in the object itself
-     */
-    public function testWillNotModifyRetrievedPublicProperties(): void
-    {
-        $proxy    = (new LazyLoadingValueHolderFactory())->createProxy(
-            ClassWithPublicProperties::class,
-            $this->createInitializer(ClassWithPublicProperties::class, new ClassWithPublicProperties())
-        );
-        $variable = $proxy->property0;
-
-        self::assertByRefVariableValueSame('property0', $variable);
-
-        $variable = 'foo';
-
-        self::assertSame('property0', $proxy->property0);
-        self::assertByRefVariableValueSame('foo', $variable);
-    }
-
-    /**
-     * Verifies that public properties references retrieved via `__get` modify in the object state
-     */
-    public function testWillModifyByRefRetrievedPublicProperties(): void
-    {
-        $proxy    = (new LazyLoadingValueHolderFactory())->createProxy(
-            ClassWithPublicProperties::class,
-            $this->createInitializer(ClassWithPublicProperties::class, new ClassWithPublicProperties())
-        );
-        $variable = & $proxy->property0;
-
-        self::assertByRefVariableValueSame('property0', $variable);
-
-        $variable = 'foo';
-
-        self::assertSame('foo', $proxy->property0);
-        self::assertByRefVariableValueSame('foo', $variable);
-    }
-
-    /**
-     * @group 16
-     *
-     * Verifies that initialization of a value holder proxy may happen multiple times
-     */
-    public function testWillAllowMultipleProxyInitialization(): void
-    {
-        $counter = 0;
-
-        $proxy = (new LazyLoadingValueHolderFactory())->createProxy(
-            BaseClass::class,
-            static function (& $wrappedInstance) use (& $counter): bool {
-                $wrappedInstance = new BaseClass();
-
-                // sometimes, we need to declare `/** @var type $var */` to declare a by-ref variable type - phpcs can't understand it
-                // phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.NoAssignment
-                /** @var int $counter */
-                $wrappedInstance->publicProperty = (string) ($counter += 1);
-
-                return true;
-            }
-        );
-
-        self::assertSame('1', $proxy->publicProperty);
-        self::assertSame('2', $proxy->publicProperty);
-        self::assertSame('3', $proxy->publicProperty);
-    }
-
-    /**
-     * @group 115
-     * @group 175
-     */
-    public function testWillBehaveLikeObjectWithNormalConstructor(): void
-    {
-        $instance = new ClassWithCounterConstructor(10);
-
-        self::assertSame(10, $instance->amount, 'Verifying that test asset works as expected');
-        self::assertSame(10, $instance->getAmount(), 'Verifying that test asset works as expected');
-        $instance->__construct(3);
-        self::assertSame(13, $instance->amount, 'Verifying that test asset works as expected');
-        self::assertSame(13, $instance->getAmount(), 'Verifying that test asset works as expected');
-
-        $proxyName = get_class(
-            (new LazyLoadingValueHolderFactory())
-                ->createProxy(
-                    ClassWithCounterConstructor::class,
-                    static function (): bool {
-                        return true;
-                    }
-                )
-        );
-
-        /** @psalm-suppress UnsafeInstantiation it is allowed (by design) to instantiate these proxies */
-        $proxy = new $proxyName(15);
-
-        self::assertSame(15, $proxy->amount, 'Verifying that the proxy constructor works as expected');
-        self::assertSame(15, $proxy->getAmount(), 'Verifying that the proxy constructor works as expected');
-        $proxy->__construct(5);
-        self::assertSame(20, $proxy->amount, 'Verifying that the proxy constructor works as expected');
-        self::assertSame(20, $proxy->getAmount(), 'Verifying that the proxy constructor works as expected');
-    }
-
-    /**
-     * @group 265
-     */
-    public function testWillForwardVariadicByRefArguments(): void
-    {
-        $object = (new LazyLoadingValueHolderFactory())->createProxy(
-            ClassWithMethodWithByRefVariadicFunction::class,
-            static function (& $wrappedInstance): bool {
-                $wrappedInstance = new ClassWithMethodWithByRefVariadicFunction();
-
-                return true;
-            }
-        );
-
-        $parameters = ['a', 'b', 'c'];
-
-        // first, testing normal variadic behavior (verifying we didn't screw up in the test asset)
-        self::assertSame(['a', 'changed', 'c'], (new ClassWithMethodWithByRefVariadicFunction())->tuz(...$parameters));
-        self::assertSame(['a', 'changed', 'c'], $object->tuz(...$parameters));
-        self::assertSame(['a', 'changed', 'c'], $parameters, 'by-ref variadic parameter was changed');
-    }
-
-    /**
-     * This test documents a known limitation: `func_get_args()` (and similars) don't work in proxied APIs.
-     * If you manage to make this test pass, then please do send a patch
-     *
-     * @group 265
-     */
-    public function testWillNotForwardDynamicArguments(): void
-    {
-        $object = (new LazyLoadingValueHolderFactory())->createProxy(
-            ClassWithDynamicArgumentsMethod::class,
-            static function (& $wrappedInstance): bool {
-                $wrappedInstance = new ClassWithDynamicArgumentsMethod();
-
-                return true;
-            }
-        );
-
-        self::assertSame(['a', 'b'], (new ClassWithDynamicArgumentsMethod())->dynamicArgumentsMethod('a', 'b'));
-
-        $this->expectException(ExpectationFailedException::class);
-
-        self::assertSame(['a', 'b'], $object->dynamicArgumentsMethod('a', 'b'));
-    }
-
-    /**
-     * @psalm-param (CallableInterface&Mock)|null $initializerMatcher
-     * @psalm-param class-string<TClass> $className
-     * @psalm-param TClass $realInstance
-     *
-     * @return Closure(
-     *  TClass|null,
-     *  VirtualProxyInterface,
-     *  string,
-     *  array,
-     *  ?Closure
-     * ) : bool
-     *
-     * @template TClass
-     */
-    private function createInitializer(string $className, $realInstance, ?Mock $initializerMatcher = null): Closure
-    {
-        if (! $initializerMatcher) {
-            $initializerMatcher = $this->createMock(CallableInterface::class);
-
-            $initializerMatcher
-                ->expects(self::once())
-                ->method('__invoke')
-                ->with(
-                    self::logicalAnd(
-                        self::isInstanceOf(VirtualProxyInterface::class),
-                        self::isInstanceOf($className)
-                    ),
-                    $realInstance
-                );
-        }
-
-        return /**
-                * @psalm-param ?TClass $wrappedObject
-                */
-        static function (
-            & $wrappedObject,
-            VirtualProxyInterface $proxy,
-            string $method,
-            array $params,
-            ?Closure & $initializer
-        ) use (
-            $initializerMatcher,
-            $realInstance
-        ): bool {
-            $initializer = null;
-
-            $wrappedObject = $realInstance;
-
-            $initializerMatcher->__invoke($proxy, $wrappedObject, $method, $params);
-
-            return true;
-        };
-    }
-
-    /**
-     * Generates a list of object, invoked method, parameters, expected result
-     *
-     * @return string[][]|object[][]|bool[][]|mixed[][][]
-     */
-    public function getProxyMethods(): array
-    {
-        $selfHintParam = new ClassWithSelfHint();
-        $empty         = new EmptyClass();
-
-        return [
-            [
-                BaseClass::class,
-                new BaseClass(),
-                'publicMethod',
-                [],
-                'publicMethodDefault',
-            ],
-            [
-                BaseClass::class,
-                new BaseClass(),
-                'publicTypeHintedMethod',
-                [new stdClass()],
-                'publicTypeHintedMethodDefault',
-            ],
-            [
-                BaseClass::class,
-                new BaseClass(),
-                'publicByReferenceMethod',
-                [],
-                'publicByReferenceMethodDefault',
-            ],
-            [
-                BaseInterface::class,
-                new BaseClass(),
-                'publicMethod',
-                [],
-                'publicMethodDefault',
-            ],
-            [
-                ClassWithSelfHint::class,
-                new ClassWithSelfHint(),
-                'selfHintMethod',
-                ['parameter' => $selfHintParam],
-                $selfHintParam,
-            ],
-            [
-                ClassWithParentHint::class,
-                new ClassWithParentHint(),
-                'parentHintMethod',
-                ['parameter' => $empty],
-                $empty,
-            ],
-            [
-                ClassWithMethodWithVariadicFunction::class,
-                new ClassWithMethodWithVariadicFunction(),
-                'buz',
-                ['Ocramius', 'Malukenho'],
-                ['Ocramius', 'Malukenho'],
-            ],
-            [
-                ClassWithMethodWithByRefVariadicFunction::class,
-                new ClassWithMethodWithByRefVariadicFunction(),
-                'tuz',
-                ['Ocramius', 'Malukenho'],
-                ['Ocramius', 'changed'],
-            ],
-            [
-                ClassWithMagicMethods::class,
-                new ClassWithMagicMethods(),
-                '__get',
-                ['parameterName'],
-                'parameterName',
-            ],
-            [
-                ClassWithMagicMethods::class,
-                new ClassWithMagicMethods(),
-                '__set',
-                ['foo', 'bar'],
-                ['foo' => 'bar'],
-            ],
-            [
-                ClassWithMagicMethods::class,
-                new ClassWithMagicMethods(),
-                '__isset',
-                ['example'],
-                true,
-            ],
-            [
-                ClassWithMagicMethods::class,
-                new ClassWithMagicMethods(),
-                '__isset',
-                [''],
-                false,
-            ],
-            [
-                ClassWithMagicMethods::class,
-                new ClassWithMagicMethods(),
-                '__unset',
-                ['example'],
-                true,
-            ],
-        ];
-    }
-
-    /**
-     * Generates proxies and instances with a public property to feed to the property accessor methods
-     *
-     * @return array<int, array<int, object|VirtualProxyInterface|string>>
-     */
-    public function getPropertyAccessProxies(): array
-    {
-        $instance1             = new BaseClass();
-        $instance2             = new BaseClass();
-
-        $factory    = new LazyLoadingValueHolderFactory();
-        $serialized = unserialize(serialize($factory->createProxy(
-            BaseClass::class,
-            $this->createInitializer(BaseClass::class, $instance2)
-        )));
-        assert($serialized instanceof VirtualProxyInterface);
-
-        $tests = [
-            [
-                $instance1,
-                $factory->createProxy(
-                    BaseClass::class,
-                    $this->createInitializer(BaseClass::class, $instance1)
-                ),
-                'publicProperty',
-                'publicPropertyDefault',
-            ],
-            [
-                $instance2,
-                $serialized,
-                'publicProperty',
-                'publicPropertyDefault',
-            ],
-        ];
-
-        if (\PHP_VERSION_ID < 70400) {
-            return $tests;
-        }
-
-        $typedProperty         = new ClassWithPublicStringTypedProperty();
-        $typedNullableProperty = new ClassWithPublicStringNullableTypedProperty();
-
-        $typedProperty->typedProperty                 = 'Typed property initialized value';
-        $typedNullableProperty->typedNullableProperty = 'Typed nullable property initialized value';
-
-        return array_merge($tests, [
-            [
-                $typedProperty,
-                $factory->createProxy(
-                    ClassWithPublicStringTypedProperty::class,
-                    $this->createInitializer(ClassWithPublicStringTypedProperty::class, $typedProperty)
-                ),
-                'typedProperty',
-                'Typed property initialized value',
-            ],
-            [
-                $typedNullableProperty,
-                $factory->createProxy(
-                    ClassWithPublicStringNullableTypedProperty::class,
-                    $this->createInitializer(ClassWithPublicStringNullableTypedProperty::class, $typedNullableProperty)
-                ),
-                'typedNullableProperty',
-                'Typed nullable property initialized value',
-            ],
-        ]);
-    }
-
-    /**
-     * @group 276
-     * @dataProvider getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope
-     */
-    public function testWillLazyLoadMembersOfOtherProxiesWithTheSamePrivateScope(
-        $callerObject,
-        $realInstance,
-        string $method,
-        string $expectedValue
-    ): void {
-        $className = get_class($realInstance);
-        $proxy     = (new LazyLoadingValueHolderFactory())->createProxy(
-            $className,
-            $this->createInitializer($className, $realInstance)
-        );
-
-        $accessor = [$callerObject, $method];
-
-        self::assertIsCallable($accessor);
-        self::assertFalse($proxy->isProxyInitialized());
-        self::assertSame($expectedValue, $accessor($proxy));
-        self::assertTrue($proxy->isProxyInitialized());
-    }
-
-    /**
-     * @group 276
-     * @dataProvider getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope
-     */
-    public function testWillFetchMembersOfOtherDeSerializedProxiesWithTheSamePrivateScope(
-        $callerObject,
-        $realInstance,
-        string $method,
-        string $expectedValue
-    ): void {
-        $className = get_class($realInstance);
-        $proxy     = unserialize(serialize((new LazyLoadingValueHolderFactory())->createProxy(
-            $className,
-            $this->createInitializer($className, $realInstance)
-        )));
-        assert($proxy instanceof LazyLoadingInterface);
-
-        $accessor = [$callerObject, $method];
-        assert(is_callable($accessor));
-
-        self::assertTrue($proxy->isProxyInitialized());
-        self::assertSame($expectedValue, $accessor($proxy));
-    }
-
-    /**
-     * @group 276
-     * @dataProvider getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope
-     */
-    public function testWillFetchMembersOfOtherClonedProxiesWithTheSamePrivateScope(
-        $callerObject,
-        $realInstance,
-        string $method,
-        string $expectedValue
-    ): void {
-        $className = get_class($realInstance);
-        $proxy     = clone (new LazyLoadingValueHolderFactory())->createProxy(
-            $className,
-            $this->createInitializer($className, $realInstance)
-        );
-
-        $accessor = [$callerObject, $method];
-        assert(is_callable($accessor));
-
-        self::assertTrue($proxy->isProxyInitialized());
-        self::assertSame($expectedValue, $accessor($proxy));
-    }
-
-    /**
-     * @group 327
-     */
-    public function testWillExecuteLogicInAVoidMethod(): void
-    {
-        $proxy = (new LazyLoadingValueHolderFactory())->createProxy(
-            VoidCounter::class,
-            $this->createInitializer(VoidCounter::class, new VoidCounter())
-        );
-
-        $increment = random_int(100, 1000);
-
-        $proxy->increment($increment);
-
-        self::assertSame($increment, $proxy->counter);
-    }
-
-    /**
-     * @requires PHP 8.1
-     *
-     * @psalm-suppress UndefinedClass Class, interface or enum named never does not exist
-     */
-    public function testWillExecuteLogicInANeverMethod(): void
-    {
-        $proxy = (new LazyLoadingValueHolderFactory())->createProxy(
-            NeverCounter::class,
-            $this->createInitializer(NeverCounter::class, new NeverCounter())
-        );
-
-        $increment = random_int(100, 1000);
-
-        try {
-            $proxy->increment($increment);
-            $this->fail('RuntimeException expected');
-        } catch (RuntimeException $e) {
-            // Do nothing
-        }
-
-        self::assertSame($increment, $proxy->counter);
-    }
-
-    public function getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope(): Generator
-    {
-        foreach ((new ReflectionClass(OtherObjectAccessClass::class))->getProperties() as $property) {
-            $propertyName  = $property->getName();
-            $expectedValue = uniqid('', true);
-
-            // callee is an actual object
-            yield OtherObjectAccessClass::class . '#$' . $propertyName => [
-                new OtherObjectAccessClass(),
-                $this->buildInstanceWithValues(new OtherObjectAccessClass(), [$propertyName => $expectedValue]),
-                'get' . ucfirst($propertyName),
-                $expectedValue,
-            ];
-
-            $expectedValue = uniqid('', true);
-
-            // callee is a proxy (not to be lazy-loaded!)
-            yield '(proxy) ' . OtherObjectAccessClass::class . '#$' . $propertyName => [
-                (new LazyLoadingValueHolderFactory())->createProxy(
-                    OtherObjectAccessClass::class,
-                    $this->createInitializer(
-                        OtherObjectAccessClass::class,
-                        new OtherObjectAccessClass()
-                    )
-                ),
-                $this->buildInstanceWithValues(new OtherObjectAccessClass(), [$propertyName => $expectedValue]),
-                'get' . ucfirst($propertyName),
-                $expectedValue,
-            ];
-        }
-    }
-
-    /** @param array<string, string> $values */
-    private function buildInstanceWithValues($instance, array $values)
-    {
-        foreach ($values as $property => $value) {
-            $property = new ReflectionProperty($instance, $property);
-
-            $property->setAccessible(true);
-
-            $property->setValue($instance, $value);
-        }
-
-        return $instance;
-    }
-
-    private static function assertByRefVariableValueSame($expected, & $actual): void
-    {
-        self::assertSame($expected, $actual);
-    }
-}
diff --git a/tests/ProxyManagerTest/Functional/MultipleProxyGenerationTest.php b/tests/ProxyManagerTest/Functional/MultipleProxyGenerationTest.php
index ffc3ff7..faf62ce 100644
--- a/tests/ProxyManagerTest/Functional/MultipleProxyGenerationTest.php
+++ b/tests/ProxyManagerTest/Functional/MultipleProxyGenerationTest.php
@@ -108,12 +108,12 @@ final class MultipleProxyGenerationTest extends TestCase
     /**
      * @return object[][]
      */
-    public function getTestedClasses(): array
+    public static function getTestedClasses(): array
     {
         $objects = [
             [new BaseClass()],
             [new ClassWithMagicMethods()],
-            [new ClassWithFinalMethods()],
+//            [new ClassWithFinalMethods()],
             [new ClassWithFinalMagicMethods()],
             [new ClassWithByRefMagicMethods()],
             [new ClassWithMixedProperties()],
diff --git a/tests/ProxyManagerTest/Functional/NullObjectFunctionalTest.php b/tests/ProxyManagerTest/Functional/NullObjectFunctionalTest.php
index bcf37bd..9946b5c 100644
--- a/tests/ProxyManagerTest/Functional/NullObjectFunctionalTest.php
+++ b/tests/ProxyManagerTest/Functional/NullObjectFunctionalTest.php
@@ -147,7 +147,7 @@ final class NullObjectFunctionalTest extends TestCase
      *
      * @return string[][]|null[][]|mixed[][][]|object[][]
      */
-    public function getProxyMethods(): array
+    public static function getProxyMethods(): array
     {
         $selfHintParam = new ClassWithSelfHint();
         $empty         = new EmptyClass();
@@ -215,7 +215,7 @@ final class NullObjectFunctionalTest extends TestCase
      *
      * @return array<int, array<int, NullObjectInterface|string|null>>
      */
-    public function getPropertyAccessProxies(): array
+    public static function getPropertyAccessProxies(): array
     {
         $factory    = new NullObjectFactory();
         $serialized = unserialize(serialize($factory->createProxy(BaseClass::class)));
diff --git a/tests/ProxyManagerTest/Functional/RemoteObjectFunctionalTest.php b/tests/ProxyManagerTest/Functional/RemoteObjectFunctionalTest.php
index d3fb41d..367b28c 100644
--- a/tests/ProxyManagerTest/Functional/RemoteObjectFunctionalTest.php
+++ b/tests/ProxyManagerTest/Functional/RemoteObjectFunctionalTest.php
@@ -154,7 +154,7 @@ final class RemoteObjectFunctionalTest extends TestCase
      *
      * @return string[][]|bool[][]|object[][]|mixed[][][]
      */
-    public function getProxyMethods(): array
+    public static function getProxyMethods(): array
     {
         $selfHintParam = new ClassWithSelfHint();
 
@@ -302,7 +302,7 @@ final class RemoteObjectFunctionalTest extends TestCase
      *
      * @return string[][]
      */
-    public function getPropertyAccessProxies(): array
+    public static function getPropertyAccessProxies(): array
     {
         return [
             [
@@ -429,7 +429,7 @@ final class RemoteObjectFunctionalTest extends TestCase
         $proxy->increment($increment);
     }
 
-    public function getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope(): Generator
+    public static function getMethodsThatAccessPropertiesOnOtherObjectsInTheSameScope(): Generator
     {
         foreach ((new ReflectionClass(OtherObjectAccessClass::class))->getProperties() as $property) {
             $property->setAccessible(true);
diff --git a/tests/ProxyManagerTest/Generator/MethodGeneratorTest.php b/tests/ProxyManagerTest/Generator/MethodGeneratorTest.php
index 9a8d53e..3c6d7ac 100644
--- a/tests/ProxyManagerTest/Generator/MethodGeneratorTest.php
+++ b/tests/ProxyManagerTest/Generator/MethodGeneratorTest.php
@@ -125,7 +125,7 @@ final class MethodGeneratorTest extends TestCase
     }
 
     /** @return string[][] */
-    public function scalarTypeHintedMethods(): array
+    public static function scalarTypeHintedMethods(): array
     {
         return [
             ['acceptString', 'string'],
diff --git a/tests/ProxyManagerTest/Generator/Util/ProxiedMethodReturnExpressionTest.php b/tests/ProxyManagerTest/Generator/Util/ProxiedMethodReturnExpressionTest.php
index 33358cb..39bc8cf 100644
--- a/tests/ProxyManagerTest/Generator/Util/ProxiedMethodReturnExpressionTest.php
+++ b/tests/ProxyManagerTest/Generator/Util/ProxiedMethodReturnExpressionTest.php
@@ -31,7 +31,7 @@ final class ProxiedMethodReturnExpressionTest extends TestCase
     /**
      * @psalm-return array<string, array{0: string, 1: ReflectionMethod|null, 2: string}>
      */
-    public function returnExpressionsProvider(): array
+    public static function returnExpressionsProvider(): array
     {
         return [
             'variable, no original method' => [
diff --git a/tests/ProxyManagerTest/ProxyGenerator/AbstractProxyGeneratorTest.php b/tests/ProxyManagerTest/ProxyGenerator/AbstractProxyGeneratorTest.php
deleted file mode 100644
index 627b3e4..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/AbstractProxyGeneratorTest.php
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator;
-
-use PHPUnit\Framework\TestCase;
-use ProxyManager\Generator\ClassGenerator;
-use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
-use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
-use ProxyManager\ProxyGenerator\ProxyGeneratorInterface;
-use ProxyManagerTestAsset\BaseClass;
-use ProxyManagerTestAsset\BaseInterface;
-use ProxyManagerTestAsset\ClassWithAbstractPublicMethod;
-use ProxyManagerTestAsset\ClassWithByRefMagicMethods;
-use ProxyManagerTestAsset\ClassWithMagicMethods;
-use ProxyManagerTestAsset\ClassWithMixedProperties;
-use ProxyManagerTestAsset\ClassWithMixedReferenceableTypedProperties;
-use ProxyManagerTestAsset\ClassWithMixedTypedProperties;
-use ProxyManagerTestAsset\ClassWithPhp80TypedMethods;
-use ProxyManagerTestAsset\ClassWithPhp81Defaults;
-use ProxyManagerTestAsset\ClassWithReadOnlyProperties;
-use ProxyManagerTestAsset\IterableMethodTypeHintedInterface;
-use ProxyManagerTestAsset\ObjectMethodTypeHintedInterface;
-use ProxyManagerTestAsset\ReturnTypeHintedClass;
-use ProxyManagerTestAsset\ReturnTypeHintedInterface;
-use ProxyManagerTestAsset\VoidMethodTypeHintedClass;
-use ProxyManagerTestAsset\VoidMethodTypeHintedInterface;
-use ReflectionClass;
-
-use const PHP_VERSION_ID;
-
-/**
- * Base test for proxy generators
- *
- * @group Coverage
- */
-abstract class AbstractProxyGeneratorTest extends TestCase
-{
-    /**
-     * @psalm-param class-string $className
-     *
-     * @dataProvider getTestedImplementations
-     *
-     * Verifies that generated code is valid and implements expected interfaces
-     */
-    public function testGeneratesValidCode(string $className): void
-    {
-        if (false !== strpos($className, 'TypedProp') && \PHP_VERSION_ID < 70400) {
-            self::markTestSkipped('PHP 7.4 required.');
-        }
-
-        $generator          = $this->getProxyGenerator();
-        $generatedClassName = UniqueIdentifierGenerator::getIdentifier('AbstractProxyGeneratorTest');
-        $generatedClass     = new ClassGenerator($generatedClassName);
-        $originalClass      = new ReflectionClass($className);
-        $generatorStrategy  = new EvaluatingGeneratorStrategy();
-
-        $generator->generate($originalClass, $generatedClass);
-        $generatorStrategy->generate($generatedClass);
-
-        $generatedReflection = new ReflectionClass($generatedClassName);
-
-        if ($originalClass->isInterface()) {
-            self::assertTrue($generatedReflection->implementsInterface($className));
-        } else {
-            $parentClass = $generatedReflection->getParentClass();
-
-            self::assertInstanceOf(ReflectionClass::class, $parentClass);
-            self::assertSame($originalClass->getName(), $parentClass->getName());
-        }
-
-        self::assertSame($generatedClassName, $generatedReflection->getName());
-
-        foreach ($this->getExpectedImplementedInterfaces() as $interface) {
-            self::assertTrue($generatedReflection->implementsInterface($interface));
-        }
-    }
-
-    /**
-     * Retrieve a new generator instance
-     */
-    abstract protected function getProxyGenerator(): ProxyGeneratorInterface;
-
-    /**
-     * Retrieve interfaces that should be implemented by the generated code
-     *
-     * @return string[]
-     * @psalm-return list<class-string>
-     */
-    abstract protected function getExpectedImplementedInterfaces(): array;
-
-    /** @return string[][] */
-    public function getTestedImplementations(): array
-    {
-        $implementations = [
-            [BaseClass::class],
-            [ClassWithMagicMethods::class],
-            [ClassWithByRefMagicMethods::class],
-            [ClassWithMixedProperties::class],
-            [ClassWithMixedTypedProperties::class],
-            [ClassWithMixedReferenceableTypedProperties::class],
-            [ClassWithAbstractPublicMethod::class],
-            [BaseInterface::class],
-            [ReturnTypeHintedClass::class],
-            [VoidMethodTypeHintedClass::class],
-            [ReturnTypeHintedInterface::class],
-            [VoidMethodTypeHintedInterface::class],
-            [IterableMethodTypeHintedInterface::class],
-            [ObjectMethodTypeHintedInterface::class],
-        ];
-
-        if (PHP_VERSION_ID >= 80000) {
-            $implementations[] = [ClassWithPhp80TypedMethods::class];
-        }
-
-        if (PHP_VERSION_ID >= 80100) {
-            $implementations['php81defaults'] = [ClassWithPhp81Defaults::class];
-            $implementations['readonly']      = [ClassWithReadOnlyProperties::class];
-        }
-
-        return $implementations;
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptor/PropertyGenerator/MethodPrefixInterceptorsTest.php b/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptor/PropertyGenerator/MethodPrefixInterceptorsTest.php
deleted file mode 100644
index a9bb5a2..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptor/PropertyGenerator/MethodPrefixInterceptorsTest.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator\AccessInterceptor\PropertyGenerator;
-
-use Laminas\Code\Generator\PropertyGenerator;
-use ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodPrefixInterceptors;
-use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodPrefixInterceptors}
- *
- * @covers \ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodPrefixInterceptors
- * @group Coverage
- */
-final class MethodPrefixInterceptorsTest extends AbstractUniquePropertyNameTest
-{
-    protected function createProperty(): PropertyGenerator
-    {
-        return new MethodPrefixInterceptors();
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptor/PropertyGenerator/MethodSuffixInterceptorsTest.php b/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptor/PropertyGenerator/MethodSuffixInterceptorsTest.php
deleted file mode 100644
index df54573..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptor/PropertyGenerator/MethodSuffixInterceptorsTest.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator\AccessInterceptor\PropertyGenerator;
-
-use Laminas\Code\Generator\PropertyGenerator;
-use ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodSuffixInterceptors;
-use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodSuffixInterceptors}
- *
- * @covers \ProxyManager\ProxyGenerator\AccessInterceptor\PropertyGenerator\MethodSuffixInterceptors
- * @group Coverage
- */
-final class MethodSuffixInterceptorsTest extends AbstractUniquePropertyNameTest
-{
-    protected function createProperty(): PropertyGenerator
-    {
-        return new MethodSuffixInterceptors();
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorScopeLocalizerTest.php b/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorScopeLocalizerTest.php
deleted file mode 100644
index c9176b3..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorScopeLocalizerTest.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator;
-
-use ProxyManager\Exception\InvalidProxiedClassException;
-use ProxyManager\Exception\UnsupportedProxiedClassException;
-use ProxyManager\Generator\ClassGenerator;
-use ProxyManager\Proxy\AccessInterceptorInterface;
-use ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizerGenerator;
-use ProxyManager\ProxyGenerator\ProxyGeneratorInterface;
-use ProxyManagerTestAsset\BaseInterface;
-use ProxyManagerTestAsset\ClassWithMixedTypedProperties;
-use ProxyManagerTestAsset\ClassWithReadOnlyProperties;
-use ReflectionClass;
-
-use function in_array;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizerGenerator}
- *
- * @covers \ProxyManager\ProxyGenerator\AccessInterceptorScopeLocalizerGenerator
- * @group Coverage
- */
-final class AccessInterceptorScopeLocalizerTest extends AbstractProxyGeneratorTest
-{
-    /**
-     * @dataProvider getTestedImplementations
-     *
-     * {@inheritDoc}
-     */
-    public function testGeneratesValidCode(string $className): void
-    {
-        if (false !== strpos($className, 'TypedProp') && \PHP_VERSION_ID < 70400) {
-            self::markTestSkipped('PHP 7.4 required.');
-        }
-
-        $reflectionClass = new ReflectionClass($className);
-
-        if ($reflectionClass->isInterface()) {
-            // @todo interfaces *may* be proxied by deferring property localization to the constructor (no hardcoding)
-            $this->expectException(InvalidProxiedClassException::class);
-        }
-
-        if (in_array($reflectionClass->getName(), [ClassWithMixedTypedProperties::class, ClassWithReadOnlyProperties::class], true)) {
-            $this->expectException(UnsupportedProxiedClassException::class);
-        }
-
-        parent::testGeneratesValidCode($className);
-    }
-
-    public function testWillRejectInterfaces(): void
-    {
-        $this->expectException(InvalidProxiedClassException::class);
-
-        $this
-            ->getProxyGenerator()
-            ->generate(new ReflectionClass(BaseInterface::class), new ClassGenerator());
-    }
-
-    protected function getProxyGenerator(): ProxyGeneratorInterface
-    {
-        return new AccessInterceptorScopeLocalizerGenerator();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function getExpectedImplementedInterfaces(): array
-    {
-        return [AccessInterceptorInterface::class];
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorValueHolderTest.php b/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorValueHolderTest.php
deleted file mode 100644
index 9ecb864..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/AccessInterceptorValueHolderTest.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator;
-
-use ProxyManager\Proxy\AccessInterceptorInterface;
-use ProxyManager\Proxy\AccessInterceptorValueHolderInterface;
-use ProxyManager\Proxy\ValueHolderInterface;
-use ProxyManager\ProxyGenerator\AccessInterceptorValueHolderGenerator;
-use ProxyManager\ProxyGenerator\ProxyGeneratorInterface;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\AccessInterceptorValueHolderGenerator}
- *
- * @covers \ProxyManager\ProxyGenerator\AccessInterceptorValueHolderGenerator
- * @group Coverage
- */
-final class AccessInterceptorValueHolderTest extends AbstractProxyGeneratorTest
-{
-    protected function getProxyGenerator(): ProxyGeneratorInterface
-    {
-        return new AccessInterceptorValueHolderGenerator();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function getExpectedImplementedInterfaces(): array
-    {
-        return [
-            AccessInterceptorValueHolderInterface::class,
-            AccessInterceptorInterface::class,
-            ValueHolderInterface::class,
-        ];
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/Assertion/CanProxyAssertionTest.php b/tests/ProxyManagerTest/ProxyGenerator/Assertion/CanProxyAssertionTest.php
index 79dc654..7cd7595 100644
--- a/tests/ProxyManagerTest/ProxyGenerator/Assertion/CanProxyAssertionTest.php
+++ b/tests/ProxyManagerTest/ProxyGenerator/Assertion/CanProxyAssertionTest.php
@@ -95,7 +95,7 @@ final class CanProxyAssertionTest extends TestCase
     /**
      * @return string[][]
      */
-    public function validClasses(): array
+    public static function validClasses(): array
     {
         return [
             [AccessInterceptorValueHolderMock::class],
diff --git a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/InitializationTrackerTest.php b/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/InitializationTrackerTest.php
deleted file mode 100644
index 008e0b8..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/InitializationTrackerTest.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\PropertyGenerator;
-
-use Laminas\Code\Generator\PropertyGenerator;
-use ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\InitializationTracker;
-use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\InitializationTracker}
- *
- * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\InitializationTracker
- * @group Coverage
- */
-final class InitializationTrackerTest extends AbstractUniquePropertyNameTest
-{
-    protected function createProperty(): PropertyGenerator
-    {
-        return new InitializationTracker();
-    }
-
-    public function testInitializationFlagIsFalseByDefault(): void
-    {
-        $defaultValue = $this->createProperty()
-            ->getDefaultValue();
-
-        self::assertNotNull($defaultValue);
-        self::assertFalse($defaultValue->getValue());
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/InitializerPropertyTest.php b/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/InitializerPropertyTest.php
deleted file mode 100644
index ba60b48..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/InitializerPropertyTest.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\PropertyGenerator;
-
-use Laminas\Code\Generator\PropertyGenerator;
-use ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\InitializerProperty;
-use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\InitializerProperty}
- *
- * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\InitializerProperty
- * @group Coverage
- */
-final class InitializerPropertyTest extends AbstractUniquePropertyNameTest
-{
-    protected function createProperty(): PropertyGenerator
-    {
-        return new InitializerProperty();
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/PrivatePropertiesMapTest.php b/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/PrivatePropertiesMapTest.php
deleted file mode 100644
index 598dc62..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/PrivatePropertiesMapTest.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\PropertyGenerator;
-
-use Laminas\Code\Generator\PropertyGenerator;
-use ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\PrivatePropertiesMap;
-use ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\ProtectedPropertiesMap;
-use ProxyManager\ProxyGenerator\Util\Properties;
-use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
-use ProxyManagerTestAsset\ClassWithAbstractProtectedMethod;
-use ProxyManagerTestAsset\ClassWithMixedProperties;
-use ReflectionClass;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\PrivatePropertiesMap}
- *
- * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\PrivatePropertiesMap
- * @group Coverage
- */
-final class PrivatePropertiesMapTest extends AbstractUniquePropertyNameTest
-{
-    protected function createProperty(): PropertyGenerator
-    {
-        return new PrivatePropertiesMap(
-            Properties::fromReflectionClass(new ReflectionClass(ClassWithMixedProperties::class))
-        );
-    }
-
-    public function testExtractsProtectedProperties(): void
-    {
-        $defaultValue = (new PrivatePropertiesMap(
-            Properties::fromReflectionClass(new ReflectionClass(ClassWithMixedProperties::class))
-        ))->getDefaultValue();
-
-        self::assertNotNull($defaultValue);
-        self::assertSame(
-            [
-                'privateProperty0' => [ClassWithMixedProperties::class => true],
-                'privateProperty1' => [ClassWithMixedProperties::class => true],
-                'privateProperty2' => [ClassWithMixedProperties::class => true],
-            ],
-            $defaultValue->getValue()
-        );
-    }
-
-    public function testSkipsAbstractProtectedMethods(): void
-    {
-        $defaultValue = (new PrivatePropertiesMap(
-            Properties::fromReflectionClass(new ReflectionClass(ClassWithAbstractProtectedMethod::class))
-        ))->getDefaultValue();
-
-        self::assertNotNull($defaultValue);
-        self::assertSame([], $defaultValue->getValue());
-    }
-
-    public function testIsStaticPrivate(): void
-    {
-        $map = $this->createProperty();
-
-        self::assertTrue($map->isStatic());
-        self::assertSame(ProtectedPropertiesMap::VISIBILITY_PRIVATE, $map->getVisibility());
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/ProtectedPropertiesMapTest.php b/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/ProtectedPropertiesMapTest.php
deleted file mode 100644
index 2f99940..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhost/PropertyGenerator/ProtectedPropertiesMapTest.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator\LazyLoadingGhost\PropertyGenerator;
-
-use Laminas\Code\Generator\PropertyGenerator;
-use ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\ProtectedPropertiesMap;
-use ProxyManager\ProxyGenerator\Util\Properties;
-use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
-use ProxyManagerTestAsset\ClassWithAbstractProtectedMethod;
-use ProxyManagerTestAsset\ClassWithMixedProperties;
-use ReflectionClass;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\ProtectedPropertiesMap}
- *
- * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhost\PropertyGenerator\ProtectedPropertiesMap
- * @group Coverage
- */
-final class ProtectedPropertiesMapTest extends AbstractUniquePropertyNameTest
-{
-    protected function createProperty(): PropertyGenerator
-    {
-        return new ProtectedPropertiesMap(
-            Properties::fromReflectionClass(new ReflectionClass(ClassWithMixedProperties::class))
-        );
-    }
-
-    public function testExtractsProtectedProperties(): void
-    {
-        $defaultValue = (new ProtectedPropertiesMap(
-            Properties::fromReflectionClass(new ReflectionClass(ClassWithMixedProperties::class))
-        ))->getDefaultValue();
-
-        self::assertNotNull($defaultValue);
-        self::assertSame(
-            [
-                'protectedProperty0' => ClassWithMixedProperties::class,
-                'protectedProperty1' => ClassWithMixedProperties::class,
-                'protectedProperty2' => ClassWithMixedProperties::class,
-            ],
-            $defaultValue->getValue()
-        );
-    }
-
-    public function testSkipsAbstractProtectedMethods(): void
-    {
-        $defaultValue = (new ProtectedPropertiesMap(
-            Properties::fromReflectionClass(new ReflectionClass(ClassWithAbstractProtectedMethod::class))
-        ))->getDefaultValue();
-
-        self::assertNotNull($defaultValue);
-        self::assertSame([], $defaultValue->getValue());
-    }
-
-    public function testIsStaticPrivate(): void
-    {
-        $map = $this->createProperty();
-
-        self::assertTrue($map->isStatic());
-        self::assertSame(ProtectedPropertiesMap::VISIBILITY_PRIVATE, $map->getVisibility());
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhostGeneratorTest.php b/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhostGeneratorTest.php
deleted file mode 100644
index 97e21d6..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingGhostGeneratorTest.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator;
-
-use ProxyManager\Exception\InvalidProxiedClassException;
-use ProxyManager\Generator\ClassGenerator;
-use ProxyManager\Proxy\GhostObjectInterface;
-use ProxyManager\ProxyGenerator\LazyLoadingGhostGenerator;
-use ProxyManager\ProxyGenerator\ProxyGeneratorInterface;
-use ProxyManagerTestAsset\BaseInterface;
-use ProxyManagerTestAsset\ClassWithAbstractPublicMethod;
-use ReflectionClass;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingGhostGenerator}
- *
- * @covers \ProxyManager\ProxyGenerator\LazyLoadingGhostGenerator
- * @group Coverage
- */
-final class LazyLoadingGhostGeneratorTest extends AbstractProxyGeneratorTest
-{
-    /**
-     * @dataProvider getTestedImplementations
-     *
-     * {@inheritDoc}
-     */
-    public function testGeneratesValidCode(string $className): void
-    {
-        if (false !== strpos($className, 'TypedProp') && \PHP_VERSION_ID < 70400) {
-            self::markTestSkipped('PHP 7.4 required.');
-        }
-
-        $reflectionClass = new ReflectionClass($className);
-
-        if ($reflectionClass->isInterface()) {
-            // @todo interfaces *may* be proxied by deferring property localization to the constructor (no hardcoding)
-            $this->expectException(InvalidProxiedClassException::class);
-        }
-
-        parent::testGeneratesValidCode($className);
-    }
-
-    public function testWillRejectInterfaces(): void
-    {
-        $this->expectException(InvalidProxiedClassException::class);
-
-        $this
-            ->getProxyGenerator()
-            ->generate(new ReflectionClass(BaseInterface::class), new ClassGenerator());
-    }
-
-    public function testAllAbstractMethodsWillBeMadeConcrete(): void
-    {
-        $classGenerator = new ClassGenerator();
-
-        $this
-            ->getProxyGenerator()
-            ->generate(new ReflectionClass(ClassWithAbstractPublicMethod::class), $classGenerator);
-
-        foreach ($classGenerator->getMethods() as $method) {
-            self::assertFalse($method->isAbstract());
-        }
-    }
-
-    protected function getProxyGenerator(): ProxyGeneratorInterface
-    {
-        return new LazyLoadingGhostGenerator();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function getExpectedImplementedInterfaces(): array
-    {
-        return [GhostObjectInterface::class];
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/PropertyGenerator/InitializerPropertyTest.php b/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/PropertyGenerator/InitializerPropertyTest.php
deleted file mode 100644
index 421a956..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/PropertyGenerator/InitializerPropertyTest.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator;
-
-use Laminas\Code\Generator\PropertyGenerator;
-use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\InitializerProperty;
-use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\InitializerProperty}
- *
- * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\InitializerProperty
- * @group Coverage
- */
-final class InitializerPropertyTest extends AbstractUniquePropertyNameTest
-{
-    protected function createProperty(): PropertyGenerator
-    {
-        return new InitializerProperty();
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/PropertyGenerator/ValueHolderPropertyTest.php b/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/PropertyGenerator/ValueHolderPropertyTest.php
deleted file mode 100644
index 63c80ac..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolder/PropertyGenerator/ValueHolderPropertyTest.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator;
-
-use Laminas\Code\Generator\PropertyGenerator;
-use ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\ValueHolderProperty;
-use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
-use ReflectionClass;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\ValueHolderProperty}
- *
- * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\ValueHolderProperty
- * @group Coverage
- */
-final class ValueHolderPropertyTest extends AbstractUniquePropertyNameTest
-{
-    protected function createProperty(): PropertyGenerator
-    {
-        return new ValueHolderProperty(new ReflectionClass(self::class));
-    }
-
-    /** @group #400 */
-    public function testWillDocumentPropertyType(): void
-    {
-        $docBlock = (new ValueHolderProperty(new ReflectionClass(self::class)))->getDocBlock();
-
-        self::assertNotNull($docBlock);
-        self::assertEquals(
-            <<<'PHPDOC'
-/**
- * @var \ProxyManagerTest\ProxyGenerator\LazyLoadingValueHolder\PropertyGenerator\ValueHolderPropertyTest|null wrapped object, if the proxy is initialized
- */
-
-PHPDOC
-            ,
-            $docBlock->generate()
-        );
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolderGeneratorTest.php b/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolderGeneratorTest.php
deleted file mode 100644
index 55f9674..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/LazyLoadingValueHolderGeneratorTest.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator;
-
-use ProxyManager\Proxy\VirtualProxyInterface;
-use ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator;
-use ProxyManager\ProxyGenerator\ProxyGeneratorInterface;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator}
- *
- * @covers \ProxyManager\ProxyGenerator\LazyLoadingValueHolderGenerator
- * @group Coverage
- */
-final class LazyLoadingValueHolderGeneratorTest extends AbstractProxyGeneratorTest
-{
-    protected function getProxyGenerator(): ProxyGeneratorInterface
-    {
-        return new LazyLoadingValueHolderGenerator();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function getExpectedImplementedInterfaces(): array
-    {
-        return [VirtualProxyInterface::class];
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/NullObjectGeneratorTest.php b/tests/ProxyManagerTest/ProxyGenerator/NullObjectGeneratorTest.php
deleted file mode 100644
index a81db80..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/NullObjectGeneratorTest.php
+++ /dev/null
@@ -1,143 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator;
-
-use ProxyManager\Generator\ClassGenerator;
-use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
-use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
-use ProxyManager\Proxy\NullObjectInterface;
-use ProxyManager\ProxyGenerator\NullObjectGenerator;
-use ProxyManager\ProxyGenerator\ProxyGeneratorInterface;
-use ProxyManager\ProxyGenerator\Util\Properties;
-use ProxyManagerTestAsset\BaseClass;
-use ProxyManagerTestAsset\BaseInterface;
-use ProxyManagerTestAsset\ClassWithByRefMagicMethods;
-use ProxyManagerTestAsset\ClassWithMagicMethods;
-use ProxyManagerTestAsset\ClassWithMixedProperties;
-use ProxyManagerTestAsset\ClassWithMixedReferenceableTypedProperties;
-use ProxyManagerTestAsset\ClassWithMixedTypedProperties;
-use ProxyManagerTestAsset\ClassWithPhp80TypedMethods;
-use ProxyManagerTestAsset\ClassWithPhp81Defaults;
-use ProxyManagerTestAsset\ClassWithReadOnlyProperties;
-use ReflectionClass;
-use ReflectionMethod;
-
-use const PHP_VERSION_ID;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\NullObjectGenerator}
- *
- * @covers \ProxyManager\ProxyGenerator\NullObjectGenerator
- * @group Coverage
- */
-final class NullObjectGeneratorTest extends AbstractProxyGeneratorTest
-{
-    /**
-     * @psalm-param class-string $className
-     *
-     * @dataProvider getTestedImplementations
-     *
-     * Verifies that generated code is valid and implements expected interfaces
-     * @psalm-suppress MoreSpecificImplementedParamType
-     */
-    public function testGeneratesValidCode(string $className): void
-    {
-        if (false !== strpos($className, 'TypedProp') && \PHP_VERSION_ID < 70400) {
-            self::markTestSkipped('PHP 7.4 required.');
-        }
-
-        $generator          = $this->getProxyGenerator();
-        $generatedClassName = UniqueIdentifierGenerator::getIdentifier('AbstractProxyGeneratorTest');
-        $generatedClass     = new ClassGenerator($generatedClassName);
-        $originalClass      = new ReflectionClass($className);
-        $generatorStrategy  = new EvaluatingGeneratorStrategy();
-
-        $generator->generate($originalClass, $generatedClass);
-        $generatorStrategy->generate($generatedClass);
-
-        $generatedReflection = new ReflectionClass($generatedClassName);
-
-        if ($originalClass->isInterface()) {
-            self::assertTrue($generatedReflection->implementsInterface($className));
-        }
-
-        self::assertSame($generatedClassName, $generatedReflection->getName());
-
-        foreach ($this->getExpectedImplementedInterfaces() as $interface) {
-            self::assertTrue($generatedReflection->implementsInterface($interface));
-        }
-
-        /**
-         * @psalm-suppress InvalidStringClass
-         * @psalm-suppress MixedAssignment
-         * @psalm-suppress MixedMethodCall
-         */
-        $proxy = $generatedClassName::staticProxyConstructor();
-
-        self::assertInstanceOf($className, $proxy);
-
-        foreach (
-            Properties::fromReflectionClass($generatedReflection)
-                ->onlyNullableProperties()
-                ->getPublicProperties() as $property
-        ) {
-            /** @psalm-suppress MixedPropertyFetch */
-            self::assertNull($proxy->{$property->getName()});
-        }
-
-        foreach ($generatedReflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
-            if ($method->getNumberOfParameters() || $method->isStatic()) {
-                continue;
-            }
-
-            $callback = [$proxy, $method->getName()];
-
-            self::assertIsCallable($callback);
-            self::assertEmpty($callback());
-        }
-    }
-
-    protected function getProxyGenerator(): ProxyGeneratorInterface
-    {
-        return new NullObjectGenerator();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function getExpectedImplementedInterfaces(): array
-    {
-        return [
-            NullObjectInterface::class,
-        ];
-    }
-
-    /**
-     * @psalm-return array<int, array<int, class-string>>
-     */
-    public function getTestedImplementations(): array
-    {
-        $implementations = [
-            [BaseClass::class],
-            [ClassWithMagicMethods::class],
-            [ClassWithByRefMagicMethods::class],
-            [ClassWithMixedProperties::class],
-            [ClassWithMixedTypedProperties::class],
-            [ClassWithMixedReferenceableTypedProperties::class],
-            [BaseInterface::class],
-        ];
-
-        if (PHP_VERSION_ID >= 80000) {
-            $implementations[] = [ClassWithPhp80TypedMethods::class];
-        }
-
-        if (PHP_VERSION_ID >= 80100) {
-            $implementations['php81defaults'] = [ClassWithPhp81Defaults::class];
-            $implementations['readonly']      = [ClassWithReadOnlyProperties::class];
-        }
-
-        return $implementations;
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/PropertyGenerator/AbstractUniquePropertyNameTest.php b/tests/ProxyManagerTest/ProxyGenerator/PropertyGenerator/AbstractUniquePropertyNameTest.php
deleted file mode 100644
index 5670a68..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/PropertyGenerator/AbstractUniquePropertyNameTest.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator\PropertyGenerator;
-
-use Laminas\Code\Generator\PropertyGenerator;
-use PHPUnit\Framework\TestCase;
-
-/**
- * Base test for unique property names
- *
- * @group Coverage
- */
-abstract class AbstractUniquePropertyNameTest extends TestCase
-{
-    /**
-     * Verifies that a given property name is the same across two different instantiations of the property
-     */
-    public function testUniqueProperty(): void
-    {
-        $property1 = $this->createProperty();
-        $property2 = $this->createProperty();
-
-        self::assertSame($property1->getName(), $property1->getName());
-        self::assertSame($property1->getName(), $property2->getName());
-    }
-
-    abstract protected function createProperty(): PropertyGenerator;
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/RemoteObject/PropertyGenerator/AdapterPropertyTest.php b/tests/ProxyManagerTest/ProxyGenerator/RemoteObject/PropertyGenerator/AdapterPropertyTest.php
deleted file mode 100644
index 5c44ed4..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/RemoteObject/PropertyGenerator/AdapterPropertyTest.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator\RemoteObject\PropertyGenerator;
-
-use Laminas\Code\Generator\PropertyGenerator;
-use ProxyManager\ProxyGenerator\RemoteObject\PropertyGenerator\AdapterProperty;
-use ProxyManagerTest\ProxyGenerator\PropertyGenerator\AbstractUniquePropertyNameTest;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\RemoteObject\PropertyGenerator\AdapterProperty}
- *
- * @covers \ProxyManager\ProxyGenerator\RemoteObject\PropertyGenerator\AdapterProperty
- * @group Coverage
- */
-final class AdapterPropertyTest extends AbstractUniquePropertyNameTest
-{
-    protected function createProperty(): PropertyGenerator
-    {
-        return new AdapterProperty();
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/RemoteObjectGeneratorTest.php b/tests/ProxyManagerTest/ProxyGenerator/RemoteObjectGeneratorTest.php
deleted file mode 100644
index 8fa66d3..0000000
--- a/tests/ProxyManagerTest/ProxyGenerator/RemoteObjectGeneratorTest.php
+++ /dev/null
@@ -1,113 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace ProxyManagerTest\ProxyGenerator;
-
-use ProxyManager\Generator\ClassGenerator;
-use ProxyManager\Generator\Util\UniqueIdentifierGenerator;
-use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
-use ProxyManager\Proxy\RemoteObjectInterface;
-use ProxyManager\ProxyGenerator\ProxyGeneratorInterface;
-use ProxyManager\ProxyGenerator\RemoteObjectGenerator;
-use ProxyManagerTestAsset\BaseClass;
-use ProxyManagerTestAsset\BaseInterface;
-use ProxyManagerTestAsset\ClassWithByRefMagicMethods;
-use ProxyManagerTestAsset\ClassWithMagicMethods;
-use ProxyManagerTestAsset\ClassWithMixedProperties;
-use ProxyManagerTestAsset\ClassWithMixedReferenceableTypedProperties;
-use ProxyManagerTestAsset\ClassWithMixedTypedProperties;
-use ProxyManagerTestAsset\ClassWithPhp80TypedMethods;
-use ProxyManagerTestAsset\ClassWithPhp81Defaults;
-use ProxyManagerTestAsset\ClassWithReadOnlyProperties;
-use ReflectionClass;
-
-use function array_diff;
-
-use const PHP_VERSION_ID;
-
-/**
- * Tests for {@see \ProxyManager\ProxyGenerator\RemoteObjectGenerator}
- *
- * @covers \ProxyManager\ProxyGenerator\RemoteObjectGenerator
- * @group Coverage
- */
-final class RemoteObjectGeneratorTest extends AbstractProxyGeneratorTest
-{
-    /**
-     * @dataProvider getTestedImplementations
-     *
-     * Verifies that generated code is valid and implements expected interfaces
-     */
-    public function testGeneratesValidCode(string $className): void
-    {
-        if (false !== strpos($className, 'TypedProp') && \PHP_VERSION_ID < 70400) {
-            self::markTestSkipped('PHP 7.4 required.');
-        }
-
-        $generator          = $this->getProxyGenerator();
-        $generatedClassName = UniqueIdentifierGenerator::getIdentifier('AbstractProxyGeneratorTest');
-        $generatedClass     = new ClassGenerator($generatedClassName);
-        $originalClass      = new ReflectionClass($className);
-        $generatorStrategy  = new EvaluatingGeneratorStrategy();
-
-        $generator->generate($originalClass, $generatedClass);
-        $generatorStrategy->generate($generatedClass);
-
-        $generatedReflection = new ReflectionClass($generatedClassName);
-
-        if ($originalClass->isInterface()) {
-            self::assertTrue($generatedReflection->implementsInterface($className));
-        } else {
-            self::assertEmpty(
-                array_diff($originalClass->getInterfaceNames(), $generatedReflection->getInterfaceNames())
-            );
-        }
-
-        self::assertSame($generatedClassName, $generatedReflection->getName());
-
-        foreach ($this->getExpectedImplementedInterfaces() as $interface) {
-            self::assertTrue($generatedReflection->implementsInterface($interface));
-        }
-    }
-
-    protected function getProxyGenerator(): ProxyGeneratorInterface
-    {
-        return new RemoteObjectGenerator();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function getExpectedImplementedInterfaces(): array
-    {
-        return [
-            RemoteObjectInterface::class,
-        ];
-    }
-
-    /** @return string[][] */
-    public function getTestedImplementations(): array
-    {
-        $implementations = [
-            [BaseClass::class],
-            [ClassWithMagicMethods::class],
-            [ClassWithByRefMagicMethods::class],
-            [ClassWithMixedProperties::class],
-            [ClassWithMixedTypedProperties::class],
-            [ClassWithMixedReferenceableTypedProperties::class],
-            [BaseInterface::class],
-        ];
-
-        if (PHP_VERSION_ID >= 80000) {
-            $implementations[] = [ClassWithPhp80TypedMethods::class];
-        }
-
-        if (PHP_VERSION_ID >= 80100) {
-            $implementations['php81defaults'] = [ClassWithPhp81Defaults::class];
-            $implementations['readonly']      = [ClassWithReadOnlyProperties::class];
-        }
-
-        return $implementations;
-    }
-}
diff --git a/tests/ProxyManagerTest/ProxyGenerator/Util/PropertiesTest.php b/tests/ProxyManagerTest/ProxyGenerator/Util/PropertiesTest.php
index b52dc73..2b3754f 100644
--- a/tests/ProxyManagerTest/ProxyGenerator/Util/PropertiesTest.php
+++ b/tests/ProxyManagerTest/ProxyGenerator/Util/PropertiesTest.php
@@ -446,7 +446,7 @@ final class PropertiesTest extends TestCase
     }
 
     /** @return string[][] */
-    public function propertiesToSkipFixture(): array
+    public static function propertiesToSkipFixture(): array
     {
         return [
             ['publicProperty0'],
diff --git a/tests/ProxyManagerTest/ProxyGenerator/Util/ProxiedMethodsFilterTest.php b/tests/ProxyManagerTest/ProxyGenerator/Util/ProxiedMethodsFilterTest.php
index f8e67be..cdb4155 100644
--- a/tests/ProxyManagerTest/ProxyGenerator/Util/ProxiedMethodsFilterTest.php
+++ b/tests/ProxyManagerTest/ProxyGenerator/Util/ProxiedMethodsFilterTest.php
@@ -86,7 +86,7 @@ final class ProxiedMethodsFilterTest extends TestCase
      *
      * @return ReflectionClass[][]|null[][]|string[][][]
      */
-    public function expectedMethods(): array
+    public static function expectedMethods(): array
     {
         return [
             [
@@ -206,7 +206,7 @@ final class ProxiedMethodsFilterTest extends TestCase
      *
      * @return ReflectionClass[][]|null[][]|string[][][]
      */
-    public function expectedAbstractPublicMethods(): array
+    public static function expectedAbstractPublicMethods(): array
     {
         return [
             [
diff --git a/tests/ProxyManagerTest/ProxyGenerator/Util/UnsetPropertiesGeneratorTest.php b/tests/ProxyManagerTest/ProxyGenerator/Util/UnsetPropertiesGeneratorTest.php
index 47ff4db..67e19af 100644
--- a/tests/ProxyManagerTest/ProxyGenerator/Util/UnsetPropertiesGeneratorTest.php
+++ b/tests/ProxyManagerTest/ProxyGenerator/Util/UnsetPropertiesGeneratorTest.php
@@ -50,7 +50,7 @@ final class UnsetPropertiesGeneratorTest extends TestCase
     /**
      * @return string[][]
      */
-    public function classNamesProvider(): array
+    public static function classNamesProvider(): array
     {
         return [
             EmptyClass::class => [
