From 4ed568645b39815b6699f098637390da967f1299 Mon Sep 17 00:00:00 2001
From: Christian Kuhn <lolli@schwarzbu.ch>
Date: Tue, 27 Feb 2024 15:50:46 +0100
Subject: [PATCH] [TASK] Modernize cache framework unit tests
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Less mocking
* Don't test AbstractFrontend but implementations
* Turn test-internal loops into data providers
* General cleanup
* Avoid phpunit 11 deprecations

Resolves: #103214
Releases: main
Change-Id: I87851d7ba6332161dc387bc6a5aea9661703428b
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/83147
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Oliver Klee <typo3-coding@oliverklee.de>
Tested-by: Stefan Bürk <stefan@buerk.tech>
Reviewed-by: Stefan Bürk <stefan@buerk.tech>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: core-ci <typo3@b13.com>
Reviewed-by: Oliver Klee <typo3-coding@oliverklee.de>
---
 .../Tests/Unit/Cache/Backend/MockBackend.php  |  52 ----
 .../Backend/TransientMemoryBackendTest.php    |   4 -
 .../Backend/Typo3DatabaseBackendTest.php      |  23 +-
 .../BackendConfigurationOptionFixture.php     |   3 -
 .../Cache/Fixtures/BackendDefaultFixture.php  |   3 -
 .../Unit/Cache/Fixtures/BackendFixture.php    |   3 -
 .../BackendInitializeObjectFixture.php        |   3 -
 .../FrontendBackendInstanceFixture.php        |   3 -
 .../Cache/Fixtures/FrontendDefaultFixture.php |   3 -
 .../Unit/Cache/Fixtures/FrontendFixture.php   |   3 -
 .../Fixtures/FrontendIdentifierFixture.php    |   3 -
 .../FrontendInitializeObjectFixture.php       |   3 -
 .../Cache/Frontend/AbstractFrontendTest.php   | 206 -------------
 .../Unit/Cache/Frontend/PhpFrontendTest.php   | 225 ++++++++++++--
 .../Cache/Frontend/VariableFrontendTest.php   | 284 ++++++++++++++----
 15 files changed, 435 insertions(+), 386 deletions(-)
 delete mode 100644 typo3/sysext/core/Tests/Unit/Cache/Backend/MockBackend.php
 delete mode 100644 typo3/sysext/core/Tests/Unit/Cache/Frontend/AbstractFrontendTest.php

diff --git a/typo3/sysext/core/Tests/Unit/Cache/Backend/MockBackend.php b/typo3/sysext/core/Tests/Unit/Cache/Backend/MockBackend.php
deleted file mode 100644
index 8bfe9013e6b9..000000000000
--- a/typo3/sysext/core/Tests/Unit/Cache/Backend/MockBackend.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-namespace TYPO3\CMS\Core\Tests\Unit\Cache\Backend;
-
-use TYPO3\CMS\Core\Cache\Backend\NullBackend;
-
-/**
- * A caching backend which forgets everything immediately
- * Used in FactoryTest
- */
-class MockBackend extends NullBackend
-{
-    /**
-     * @var mixed
-     */
-    protected $someOption;
-
-    /**
-     * Sets some option
-     *
-     * @param mixed $value
-     */
-    public function setSomeOption($value): void
-    {
-        $this->someOption = $value;
-    }
-
-    /**
-     * Returns the option value
-     *
-     * @return mixed
-     */
-    public function getSomeOption()
-    {
-        return $this->someOption;
-    }
-}
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Backend/TransientMemoryBackendTest.php b/typo3/sysext/core/Tests/Unit/Cache/Backend/TransientMemoryBackendTest.php
index 81d02162c97e..6521e988bef0 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Backend/TransientMemoryBackendTest.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Backend/TransientMemoryBackendTest.php
@@ -23,9 +23,6 @@ use TYPO3\CMS\Core\Cache\Exception;
 use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
-/**
- * Testcase for the TransientMemory cache backend
- */
 final class TransientMemoryBackendTest extends UnitTestCase
 {
     protected bool $resetSingletonInstances = true;
@@ -35,7 +32,6 @@ final class TransientMemoryBackendTest extends UnitTestCase
     {
         $this->expectException(Exception::class);
         $this->expectExceptionCode(1238244992);
-
         $backend = new TransientMemoryBackend('Testing');
         $data = 'Some data';
         $identifier = 'MyIdentifier';
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Backend/Typo3DatabaseBackendTest.php b/typo3/sysext/core/Tests/Unit/Cache/Backend/Typo3DatabaseBackendTest.php
index fe21f51a0a0b..1fd8ec76b252 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Backend/Typo3DatabaseBackendTest.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Backend/Typo3DatabaseBackendTest.php
@@ -37,7 +37,6 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
         $frontend = new NullFrontend('test');
         $subject = new Typo3DatabaseBackend('Testing');
         $subject->setCache($frontend);
-
         self::assertEquals('cache_test', $subject->getCacheTable());
     }
 
@@ -63,67 +62,65 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
     #[Test]
     public function setThrowsExceptionIfDataIsNotAString(): void
     {
+        $this->expectException(InvalidDataException::class);
+        $this->expectExceptionCode(1236518298);
         $frontend = new NullFrontend('test');
         $subject = new Typo3DatabaseBackend('Testing');
         $subject->setCache($frontend);
-
-        $this->expectException(InvalidDataException::class);
-        $this->expectExceptionCode(1236518298);
-
         $subject->set('identifier', ['iAmAnArray']);
     }
 
     #[Test]
     public function getThrowsExceptionIfFrontendWasNotSet(): void
     {
-        $subject = new Typo3DatabaseBackend('Testing');
         $this->expectException(Exception::class);
         $this->expectExceptionCode(1236518288);
+        $subject = new Typo3DatabaseBackend('Testing');
         $subject->get('identifier');
     }
 
     #[Test]
     public function hasThrowsExceptionIfFrontendWasNotSet(): void
     {
-        $subject = new Typo3DatabaseBackend('Testing');
         $this->expectException(Exception::class);
         $this->expectExceptionCode(1236518288);
+        $subject = new Typo3DatabaseBackend('Testing');
         $subject->has('identifier');
     }
 
     #[Test]
     public function removeThrowsExceptionIfFrontendWasNotSet(): void
     {
-        $subject = new Typo3DatabaseBackend('Testing');
         $this->expectException(Exception::class);
         $this->expectExceptionCode(1236518288);
+        $subject = new Typo3DatabaseBackend('Testing');
         $subject->remove('identifier');
     }
 
     #[Test]
     public function collectGarbageThrowsExceptionIfFrontendWasNotSet(): void
     {
-        $subject = new Typo3DatabaseBackend('Testing');
         $this->expectException(Exception::class);
         $this->expectExceptionCode(1236518288);
+        $subject = new Typo3DatabaseBackend('Testing');
         $subject->collectGarbage();
     }
 
     #[Test]
     public function findIdentifiersByTagThrowsExceptionIfFrontendWasNotSet(): void
     {
-        $subject = new Typo3DatabaseBackend('Testing');
         $this->expectException(Exception::class);
         $this->expectExceptionCode(1236518288);
+        $subject = new Typo3DatabaseBackend('Testing');
         $subject->findIdentifiersByTag('identifier');
     }
 
     #[Test]
     public function flushThrowsExceptionIfFrontendWasNotSet(): void
     {
-        $subject = new Typo3DatabaseBackend('Testing');
         $this->expectException(Exception::class);
         $this->expectExceptionCode(1236518288);
+        $subject = new Typo3DatabaseBackend('Testing');
         $subject->flush();
     }
 
@@ -210,18 +207,18 @@ final class Typo3DatabaseBackendTest extends UnitTestCase
     #[Test]
     public function flushByTagThrowsExceptionIfFrontendWasNotSet(): void
     {
-        $subject = new Typo3DatabaseBackend('Testing');
         $this->expectException(Exception::class);
         $this->expectExceptionCode(1236518288);
+        $subject = new Typo3DatabaseBackend('Testing');
         $subject->flushByTag('Tag');
     }
 
     #[Test]
     public function flushByTagsThrowsExceptionIfFrontendWasNotSet(): void
     {
-        $subject = new Typo3DatabaseBackend('Testing');
         $this->expectException(Exception::class);
         $this->expectExceptionCode(1236518288);
+        $subject = new Typo3DatabaseBackend('Testing');
         $subject->flushByTags([]);
     }
 }
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendConfigurationOptionFixture.php b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendConfigurationOptionFixture.php
index 1197fd4e44b9..53a6a4b8ff13 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendConfigurationOptionFixture.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendConfigurationOptionFixture.php
@@ -17,9 +17,6 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache\Fixtures;
 
-/**
- * Backend fixture for CacheManager test getCacheCreatesBackendWithGivenConfiguration()
- */
 class BackendConfigurationOptionFixture extends BackendFixture
 {
     /**
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendDefaultFixture.php b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendDefaultFixture.php
index 642962fdff29..e13c42f04bbf 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendDefaultFixture.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendDefaultFixture.php
@@ -17,9 +17,6 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache\Fixtures;
 
-/**
-* Backend for cache manager test getCacheCreatesCacheInstanceWithFallbackToDefaultBackend
-*/
 class BackendDefaultFixture extends BackendFixture
 {
     public function __construct()
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendFixture.php b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendFixture.php
index 3828440f528d..a916cddd8eb8 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendFixture.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendFixture.php
@@ -20,9 +20,6 @@ namespace TYPO3\CMS\Core\Tests\Unit\Cache\Fixtures;
 use TYPO3\CMS\Core\Cache\Backend\BackendInterface;
 use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
 
-/**
- * Backend fixture to test cache manager.
- */
 class BackendFixture implements BackendInterface
 {
     public function setCache(FrontendInterface $cache): void {}
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendInitializeObjectFixture.php b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendInitializeObjectFixture.php
index 2424f777f7ee..9aace3bc8d46 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendInitializeObjectFixture.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/BackendInitializeObjectFixture.php
@@ -17,9 +17,6 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache\Fixtures;
 
-/**
- * Fixture to test cache manager details
- */
 class BackendInitializeObjectFixture extends BackendFixture
 {
     public function initializeObject(): void
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendBackendInstanceFixture.php b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendBackendInstanceFixture.php
index d5506575b121..d3731083ca09 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendBackendInstanceFixture.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendBackendInstanceFixture.php
@@ -17,9 +17,6 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache\Fixtures;
 
-/**
-* Frontend for cache manager test getCacheGivesBackendInstanceToCacheFrontend
-*/
 class FrontendBackendInstanceFixture extends FrontendFixture
 {
     public function __construct($_, $backend)
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendDefaultFixture.php b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendDefaultFixture.php
index a658f4f4fa32..405c61ea523d 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendDefaultFixture.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendDefaultFixture.php
@@ -17,9 +17,6 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache\Fixtures;
 
-/**
-* Frontend for cache manager test getCacheCreatesCacheInstanceWithFallbackToDefaultFrontend
-*/
 class FrontendDefaultFixture extends FrontendFixture
 {
     public function __construct()
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendFixture.php b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendFixture.php
index cd6c91915b62..2a0c1e6ac9bc 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendFixture.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendFixture.php
@@ -19,9 +19,6 @@ namespace TYPO3\CMS\Core\Tests\Unit\Cache\Fixtures;
 
 use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
 
-/**
-* Fixture implementing frontend
-*/
 class FrontendFixture implements FrontendInterface
 {
     protected string $identifier;
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendIdentifierFixture.php b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendIdentifierFixture.php
index 6d203275cbe4..153ff539049a 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendIdentifierFixture.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendIdentifierFixture.php
@@ -17,9 +17,6 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache\Fixtures;
 
-/**
-* Frontend for cache manager test getCacheGivesIdentifierToCacheFrontend
-*/
 class FrontendIdentifierFixture extends FrontendFixture
 {
     public function __construct($identifier)
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendInitializeObjectFixture.php b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendInitializeObjectFixture.php
index 85b48b782fbf..f0aca8f9bf50 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendInitializeObjectFixture.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Fixtures/FrontendInitializeObjectFixture.php
@@ -17,9 +17,6 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache\Fixtures;
 
-/**
-* Fixture implementing frontend
-*/
 class FrontendInitializeObjectFixture extends FrontendFixture
 {
     public function initializeObject(): void
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Frontend/AbstractFrontendTest.php b/typo3/sysext/core/Tests/Unit/Cache/Frontend/AbstractFrontendTest.php
deleted file mode 100644
index 0338d06de5e0..000000000000
--- a/typo3/sysext/core/Tests/Unit/Cache/Frontend/AbstractFrontendTest.php
+++ /dev/null
@@ -1,206 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-namespace TYPO3\CMS\Core\Tests\Unit\Cache\Frontend;
-
-use PHPUnit\Framework\Attributes\Test;
-use TYPO3\CMS\Core\Cache\Backend\AbstractBackend;
-use TYPO3\CMS\Core\Cache\Backend\TaggableBackendInterface;
-use TYPO3\CMS\Core\Cache\Frontend\VariableFrontend;
-use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
-
-/**
- * Testcase for the abstract cache frontend
- */
-final class AbstractFrontendTest extends UnitTestCase
-{
-    #[Test]
-    public function theConstructorAcceptsValidIdentifiers(): void
-    {
-        $mockBackend = $this->getMockBuilder(AbstractBackend::class)
-            ->onlyMethods(['get', 'set', 'has', 'remove', 'flush', 'collectGarbage'])
-            ->addMethods(['findIdentifiersByTag', 'flushByTag'])
-            ->disableOriginalConstructor()
-            ->getMock();
-        foreach (['x', 'someValue', '123fivesixseveneight', 'some&', 'ab_cd%', rawurlencode('resource://some/äöü$&% sadf'), str_repeat('x', 250)] as $identifier) {
-            $this->getMockBuilder(VariableFrontend::class)
-                ->onlyMethods(['__construct', 'get', 'set', 'has', 'remove', 'flush', 'flushByTag', 'collectGarbage'])
-                ->setConstructorArgs([$identifier, $mockBackend])
-                ->getMock();
-        }
-    }
-
-    #[Test]
-    public function theConstructorRejectsInvalidIdentifiers(): void
-    {
-        $mockBackend = $this->getMockBuilder(AbstractBackend::class)
-            ->onlyMethods(['get', 'set', 'has', 'remove', 'flush', 'collectGarbage'])
-            ->addMethods(['findIdentifiersByTag', 'flushByTag'])
-            ->disableOriginalConstructor()
-            ->getMock();
-        foreach (['', 'abc def', 'foo!', 'bar:', 'some/', 'bla*', 'one+', 'äöü', str_repeat('x', 251), 'x$', '\\a', 'b#'] as $identifier) {
-            try {
-                $this->getMockBuilder(VariableFrontend::class)
-                    ->onlyMethods(['__construct', 'get', 'set', 'has', 'remove', 'flush', 'flushByTag', 'collectGarbage'])
-                    ->setConstructorArgs([$identifier, $mockBackend])
-                    ->getMock();
-                self::fail('Identifier "' . $identifier . '" was not rejected.');
-            } catch (\InvalidArgumentException $exception) {
-            }
-        }
-    }
-
-    #[Test]
-    public function flushCallsBackend(): void
-    {
-        $identifier = 'someCacheIdentifier';
-        $backend = $this->getMockBuilder(AbstractBackend::class)
-            ->onlyMethods(['get', 'set', 'has', 'remove', 'flush', 'collectGarbage'])
-            ->addMethods(['findIdentifiersByTag', 'flushByTag'])
-            ->disableOriginalConstructor()
-            ->getMock();
-        $backend->expects(self::once())->method('flush');
-        $cache = $this->getMockBuilder(VariableFrontend::class)
-            ->onlyMethods(['__construct', 'get', 'set', 'has', 'remove'])
-            ->setConstructorArgs([$identifier, $backend])
-            ->getMock();
-        $cache->flush();
-    }
-
-    #[Test]
-    public function flushByTagRejectsInvalidTags(): void
-    {
-        $this->expectException(\InvalidArgumentException::class);
-        $this->expectExceptionCode(1233057359);
-
-        $identifier = 'someCacheIdentifier';
-        $backend = $this->createMock(TaggableBackendInterface::class);
-        $backend->expects(self::never())->method('flushByTag');
-        $cache = $this->getMockBuilder(VariableFrontend::class)
-            ->onlyMethods(['__construct', 'get', 'set', 'has', 'remove'])
-            ->setConstructorArgs([$identifier, $backend])
-            ->getMock();
-        $cache->flushByTag('SomeInvalid\\Tag');
-    }
-
-    #[Test]
-    public function flushByTagCallsBackendIfItIsATaggableBackend(): void
-    {
-        $tag = 'sometag';
-        $identifier = 'someCacheIdentifier';
-        $backend = $this->getMockBuilder(TaggableBackendInterface::class)
-            ->onlyMethods(['setCache', 'get', 'set', 'has', 'remove', 'findIdentifiersByTag', 'flush', 'flushByTag', 'flushByTags', 'collectGarbage'])
-            ->disableOriginalConstructor()
-            ->getMock();
-        $backend->expects(self::once())->method('flushByTag')->with($tag);
-        $cache = $this->getMockBuilder(VariableFrontend::class)
-            ->onlyMethods(['__construct', 'get', 'set', 'has', 'remove'])
-            ->setConstructorArgs([$identifier, $backend])
-            ->getMock();
-        $cache->flushByTag($tag);
-    }
-
-    #[Test]
-    public function flushByTagsCallsBackendIfItIsATaggableBackend(): void
-    {
-        $tag = 'sometag';
-        $identifier = 'someCacheIdentifier';
-        $backend = $this->getMockBuilder(TaggableBackendInterface::class)
-            ->onlyMethods(['setCache', 'get', 'set', 'has', 'remove', 'findIdentifiersByTag', 'flush', 'flushByTag', 'flushByTags', 'collectGarbage'])
-            ->disableOriginalConstructor()
-            ->getMock();
-        $backend->expects(self::once())->method('flushByTags')->with([$tag]);
-        $cache = $this->getMockBuilder(VariableFrontend::class)
-            ->onlyMethods(['__construct', 'get', 'set', 'has', 'remove'])
-            ->setConstructorArgs([$identifier, $backend])
-            ->getMock();
-        $cache->flushByTags([$tag]);
-    }
-
-    #[Test]
-    public function collectGarbageCallsBackend(): void
-    {
-        $identifier = 'someCacheIdentifier';
-        $backend = $this->getMockBuilder(AbstractBackend::class)
-            ->onlyMethods(['get', 'set', 'has', 'remove', 'flush', 'collectGarbage'])
-            ->addMethods(['findIdentifiersByTag', 'flushByTag'])
-            ->disableOriginalConstructor()
-            ->getMock();
-        $backend->expects(self::once())->method('collectGarbage');
-        $cache = $this->getMockBuilder(VariableFrontend::class)
-            ->onlyMethods(['__construct', 'get', 'set', 'has', 'remove'])
-            ->setConstructorArgs([$identifier, $backend])
-            ->getMock();
-        $cache->collectGarbage();
-    }
-
-    #[Test]
-    public function invalidEntryIdentifiersAreRecognizedAsInvalid(): void
-    {
-        $identifier = 'someCacheIdentifier';
-        $backend = $this->createMock(AbstractBackend::class);
-        $cache = $this->getMockBuilder(VariableFrontend::class)
-            ->onlyMethods(['__construct', 'get', 'set', 'has', 'remove'])
-            ->setConstructorArgs([$identifier, $backend])
-            ->getMock();
-        foreach (['', 'abc def', 'foo!', 'bar:', 'some/', 'bla*', 'one+', 'äöü', str_repeat('x', 251), 'x$', '\\a', 'b#'] as $entryIdentifier) {
-            self::assertFalse($cache->isValidEntryIdentifier($entryIdentifier), 'Invalid identifier "' . $entryIdentifier . '" was not rejected.');
-        }
-    }
-
-    #[Test]
-    public function validEntryIdentifiersAreRecognizedAsValid(): void
-    {
-        $identifier = 'someCacheIdentifier';
-        $backend = $this->createMock(AbstractBackend::class);
-        $cache = $this->getMockBuilder(VariableFrontend::class)
-            ->onlyMethods(['__construct', 'get', 'set', 'has', 'remove'])
-            ->setConstructorArgs([$identifier, $backend])
-            ->getMock();
-        foreach (['_', 'abcdef', 'foo', 'bar123', '3some', '_bl_a', 'some&', 'one%TWO', str_repeat('x', 250)] as $entryIdentifier) {
-            self::assertTrue($cache->isValidEntryIdentifier($entryIdentifier), 'Valid identifier "' . $entryIdentifier . '" was not accepted.');
-        }
-    }
-
-    #[Test]
-    public function invalidTagsAreRecognizedAsInvalid(): void
-    {
-        $identifier = 'someCacheIdentifier';
-        $backend = $this->createMock(AbstractBackend::class);
-        $cache = $this->getMockBuilder(VariableFrontend::class)
-            ->onlyMethods(['__construct', 'get', 'set', 'has', 'remove'])
-            ->setConstructorArgs([$identifier, $backend])
-            ->getMock();
-        foreach (['', 'abc def', 'foo!', 'bar:', 'some/', 'bla*', 'one+', 'äöü', str_repeat('x', 251), 'x$', '\\a', 'b#'] as $tag) {
-            self::assertFalse($cache->isValidTag($tag), 'Invalid tag "' . $tag . '" was not rejected.');
-        }
-    }
-
-    #[Test]
-    public function validTagsAreRecognizedAsValid(): void
-    {
-        $identifier = 'someCacheIdentifier';
-        $backend = $this->createMock(AbstractBackend::class);
-        $cache = $this->getMockBuilder(VariableFrontend::class)
-            ->onlyMethods(['__construct', 'get', 'set', 'has', 'remove'])
-            ->setConstructorArgs([$identifier, $backend])
-            ->getMock();
-        foreach (['abcdef', 'foo-bar', 'foo_baar', 'bar123', '3some', 'file%Thing', 'some&', '%x%', str_repeat('x', 250)] as $tag) {
-            self::assertTrue($cache->isValidTag($tag), 'Valid tag "' . $tag . '" was not accepted.');
-        }
-    }
-}
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Frontend/PhpFrontendTest.php b/typo3/sysext/core/Tests/Unit/Cache/Frontend/PhpFrontendTest.php
index 56364d94a6c7..775e0c3dce0d 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Frontend/PhpFrontendTest.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Frontend/PhpFrontendTest.php
@@ -17,31 +17,222 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache\Frontend;
 
+use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
+use TYPO3\CMS\Core\Cache\Backend\FileBackend;
 use TYPO3\CMS\Core\Cache\Backend\PhpCapableBackendInterface;
 use TYPO3\CMS\Core\Cache\Backend\SimpleFileBackend;
 use TYPO3\CMS\Core\Cache\Exception\InvalidDataException;
 use TYPO3\CMS\Core\Cache\Frontend\PhpFrontend;
-use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
-/**
- * Testcase for the PHP source code cache frontend
- */
 final class PhpFrontendTest extends UnitTestCase
 {
+    public static function constructAcceptsValidIdentifiersDataProvider(): array
+    {
+        return [
+            ['x'],
+            ['someValue'],
+            ['123fivesixseveneight'],
+            ['some&'],
+            ['ab_cd%'],
+            [rawurlencode('resource://some/äöü$&% sadf')],
+            [str_repeat('x', 250)],
+        ];
+    }
+
+    #[Test]
+    #[DataProvider('constructAcceptsValidIdentifiersDataProvider')]
+    public function constructAcceptsValidIdentifiers(string $identifier): void
+    {
+        new PhpFrontend($identifier, $this->createMock(PhpCapableBackendInterface::class));
+    }
+
+    public static function constructRejectsInvalidIdentifiersDataProvider(): array
+    {
+        return [
+            [''],
+            ['abc def'],
+            ['foo!'],
+            ['bar:'],
+            ['some/'],
+            ['bla*'],
+            ['one+'],
+            ['äöü'],
+            [str_repeat('x', 251)],
+            ['x$'],
+            ['\\a'],
+            ['b#'],
+        ];
+    }
+
+    #[Test]
+    #[DataProvider('constructRejectsInvalidIdentifiersDataProvider')]
+    public function constructRejectsInvalidIdentifiers(string $identifier): void
+    {
+        $this->expectException(\InvalidArgumentException::class);
+        $this->expectExceptionCode(1203584729);
+        new PhpFrontend($identifier, $this->createMock(PhpCapableBackendInterface::class));
+    }
+
+    #[Test]
+    public function flushCallsBackend(): void
+    {
+        $backend = $this->createMock(PhpCapableBackendInterface::class);
+        $backend->expects(self::once())->method('flush');
+        $cache = new PhpFrontend('someCacheIdentifier', $backend);
+        $cache->flush();
+    }
+
+    #[Test]
+    public function flushByTagRejectsInvalidTags(): void
+    {
+        $this->expectException(\InvalidArgumentException::class);
+        $this->expectExceptionCode(1233057359);
+        $backend = $this->createMock(FileBackend::class);
+        $backend->expects(self::never())->method('flushByTag');
+        $cache = new PhpFrontend('someCacheIdentifier', $backend);
+        $cache->flushByTag('SomeInvalid\\Tag');
+    }
+
+    #[Test]
+    public function flushByTagCallsBackendIfItIsATaggableBackend(): void
+    {
+        $tag = 'someTag';
+        $backend = $this->createMock(FileBackend::class);
+        $backend->expects(self::once())->method('flushByTag')->with($tag);
+        $cache = new PhpFrontend('someCacheIdentifier', $backend);
+        $cache->flushByTag($tag);
+    }
+
+    #[Test]
+    public function flushByTagsCallsBackendIfItIsATaggableBackend(): void
+    {
+        $tag = 'someTag';
+        $backend = $this->createMock(FileBackend::class);
+        $backend->expects(self::once())->method('flushByTags')->with([$tag]);
+        $cache = new PhpFrontend('someCacheIdentifier', $backend);
+        $cache->flushByTags([$tag]);
+    }
+
+    #[Test]
+    public function collectGarbageCallsBackend(): void
+    {
+        $backend = $this->createMock(PhpCapableBackendInterface::class);
+        $backend->expects(self::once())->method('collectGarbage');
+        $cache = new PhpFrontend('someCacheIdentifier', $backend);
+        $cache->collectGarbage();
+    }
+
+    public static function isValidEntryIdentifierReturnsFalseWithValidIdentifierDataProvider(): array
+    {
+        return [
+            [''],
+            ['abc def'],
+            ['foo!'],
+            ['bar:'],
+            ['some/'],
+            ['bla*'],
+            ['one+'],
+            ['äöü'],
+            [str_repeat('x', 251)],
+            ['x$'],
+            ['\\a'],
+            ['b#'],
+        ];
+    }
+
+    #[Test]
+    #[DataProvider('isValidEntryIdentifierReturnsFalseWithValidIdentifierDataProvider')]
+    public function isValidEntryIdentifierReturnsFalseWithValidIdentifier(string $identifier): void
+    {
+        $backend = $this->createMock(PhpCapableBackendInterface::class);
+        $cache = new PhpFrontend('someCacheIdentifier', $backend);
+        self::assertFalse($cache->isValidEntryIdentifier($identifier));
+    }
+
+    public static function isValidEntryIdentifierReturnsTrueWithValidIdentifierDataProvider(): array
+    {
+        return [
+            ['_'],
+            ['abcdef'],
+            ['foo'],
+            ['bar123'],
+            ['3some'],
+            ['_bl_a'],
+            ['some&'],
+            ['one%TWO'],
+            [str_repeat('x', 250)],
+        ];
+    }
+
+    #[Test]
+    #[DataProvider('isValidEntryIdentifierReturnsTrueWithValidIdentifierDataProvider')]
+    public function isValidEntryIdentifierReturnsTrueWithValidIdentifier(string $identifier): void
+    {
+        $backend = $this->createMock(PhpCapableBackendInterface::class);
+        $cache = new PhpFrontend('someCacheIdentifier', $backend);
+        self::assertTrue($cache->isValidEntryIdentifier($identifier));
+    }
+
+    public static function isValidTagReturnsFalseWithInvalidTagDataProvider(): array
+    {
+        return [
+            [''],
+            ['abc def'],
+            ['foo!'],
+            ['bar:'],
+            ['some/'],
+            ['bla*'],
+            ['one+'],
+            ['äöü'],
+            [str_repeat('x', 251)],
+            ['x$'],
+            ['\\a'],
+            ['b#'],
+        ];
+    }
+
+    #[Test]
+    #[DataProvider('isValidTagReturnsFalseWithInvalidTagDataProvider')]
+    public function isValidTagReturnsFalseWithInvalidTag(string $tag): void
+    {
+        $backend = $this->createMock(PhpCapableBackendInterface::class);
+        $cache = new PhpFrontend('someCacheIdentifier', $backend);
+        self::assertFalse($cache->isValidTag($tag));
+    }
+
+    public static function isValidTagReturnsTrueWithValidTagDataProvider(): array
+    {
+        return [
+            ['abcdef'],
+            ['foo-bar'],
+            ['foo_baar'],
+            ['bar123'],
+            ['3some'],
+            ['file%Thing'],
+            ['some&'],
+            ['%x%'],
+            [str_repeat('x', 250)],
+        ];
+    }
+
+    #[Test]
+    #[DataProvider('isValidTagReturnsTrueWithValidTagDataProvider')]
+    public function isValidTagReturnsTrueWithValidTag(string $tag): void
+    {
+        $backend = $this->createMock(PhpCapableBackendInterface::class);
+        $cache = new PhpFrontend('someCacheIdentifier', $backend);
+        self::assertTrue($cache->isValidTag($tag));
+    }
+
     #[Test]
     public function setChecksIfTheIdentifierIsValid(): void
     {
         $this->expectException(\InvalidArgumentException::class);
         $this->expectExceptionCode(1264023823);
-
-        $cache = $this->getMockBuilder(PhpFrontend::class)
-            ->onlyMethods(['isValidEntryIdentifier'])
-            ->disableOriginalConstructor()
-            ->getMock();
-        $cache->expects(self::once())->method('isValidEntryIdentifier')->with('foo')->willReturn(false);
-        $cache->set('foo', 'bar');
+        $cache = new PhpFrontend('someCacheIdentifier', $this->createMock(PhpCapableBackendInterface::class));
+        $cache->set('invalid identifier', 'bar');
     }
 
     #[Test]
@@ -51,7 +242,7 @@ final class PhpFrontendTest extends UnitTestCase
         $modifiedSourceCode = '<?php' . chr(10) . $originalSourceCode . chr(10) . '#';
         $mockBackend = $this->createMock(PhpCapableBackendInterface::class);
         $mockBackend->expects(self::once())->method('set')->with('Foo-Bar', $modifiedSourceCode, ['tags'], 1234);
-        $cache = GeneralUtility::makeInstance(PhpFrontend::class, 'PhpFrontend', $mockBackend);
+        $cache = new PhpFrontend('someCacheIdentifier', $mockBackend);
         $cache->set('Foo-Bar', $originalSourceCode, ['tags'], 1234);
     }
 
@@ -60,11 +251,7 @@ final class PhpFrontendTest extends UnitTestCase
     {
         $this->expectException(InvalidDataException::class);
         $this->expectExceptionCode(1264023824);
-
-        $cache = $this->getMockBuilder(PhpFrontend::class)
-            ->addMethods(['dummy'])
-            ->disableOriginalConstructor()
-            ->getMock();
+        $cache = new PhpFrontend('someCacheIdentifier', $this->createMock(PhpCapableBackendInterface::class));
         $cache->set('Foo-Bar', []);
     }
 
@@ -73,7 +260,7 @@ final class PhpFrontendTest extends UnitTestCase
     {
         $mockBackend = $this->createMock(PhpCapableBackendInterface::class);
         $mockBackend->expects(self::once())->method('requireOnce')->with('Foo-Bar')->willReturn('hello world!');
-        $cache = GeneralUtility::makeInstance(PhpFrontend::class, 'PhpFrontend', $mockBackend);
+        $cache = new PhpFrontend('someCacheIdentifier', $mockBackend);
         $result = $cache->requireOnce('Foo-Bar');
         self::assertSame('hello world!', $result);
     }
@@ -83,7 +270,7 @@ final class PhpFrontendTest extends UnitTestCase
     {
         $mockBackend = $this->createMock(SimpleFileBackend::class);
         $mockBackend->expects(self::once())->method('require')->with('Foo-Bar')->willReturn('hello world!');
-        $cache = GeneralUtility::makeInstance(PhpFrontend::class, 'PhpFrontend', $mockBackend);
+        $cache = new PhpFrontend('someCacheIdentifier', $mockBackend);
         $result = $cache->require('Foo-Bar');
         self::assertSame('hello world!', $result);
     }
diff --git a/typo3/sysext/core/Tests/Unit/Cache/Frontend/VariableFrontendTest.php b/typo3/sysext/core/Tests/Unit/Cache/Frontend/VariableFrontendTest.php
index 3e3e59d84842..0d9ea0eeb46a 100644
--- a/typo3/sysext/core/Tests/Unit/Cache/Frontend/VariableFrontendTest.php
+++ b/typo3/sysext/core/Tests/Unit/Cache/Frontend/VariableFrontendTest.php
@@ -17,38 +17,228 @@ declare(strict_types=1);
 
 namespace TYPO3\CMS\Core\Tests\Unit\Cache\Frontend;
 
+use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\Attributes\Test;
-use TYPO3\CMS\Core\Cache\Backend\AbstractBackend;
+use TYPO3\CMS\Core\Cache\Backend\BackendInterface;
+use TYPO3\CMS\Core\Cache\Backend\TaggableBackendInterface;
 use TYPO3\CMS\Core\Cache\Frontend\VariableFrontend;
 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
 
 final class VariableFrontendTest extends UnitTestCase
 {
+    public static function constructAcceptsValidIdentifiersDataProvider(): array
+    {
+        return [
+            ['x'],
+            ['someValue'],
+            ['123fivesixseveneight'],
+            ['some&'],
+            ['ab_cd%'],
+            [rawurlencode('resource://some/äöü$&% sadf')],
+            [str_repeat('x', 250)],
+        ];
+    }
+
+    #[Test]
+    #[DataProvider('constructAcceptsValidIdentifiersDataProvider')]
+    public function constructAcceptsValidIdentifiers(string $identifier): void
+    {
+        new VariableFrontend($identifier, $this->createMock(BackendInterface::class));
+    }
+
+    public static function constructRejectsInvalidIdentifiersDataProvider(): array
+    {
+        return [
+            [''],
+            ['abc def'],
+            ['foo!'],
+            ['bar:'],
+            ['some/'],
+            ['bla*'],
+            ['one+'],
+            ['äöü'],
+            [str_repeat('x', 251)],
+            ['x$'],
+            ['\\a'],
+            ['b#'],
+        ];
+    }
+
+    #[Test]
+    #[DataProvider('constructRejectsInvalidIdentifiersDataProvider')]
+    public function constructRejectsInvalidIdentifiers(string $identifier): void
+    {
+        $this->expectException(\InvalidArgumentException::class);
+        $this->expectExceptionCode(1203584729);
+        new VariableFrontend($identifier, $this->createMock(BackendInterface::class));
+    }
+
+    #[Test]
+    public function flushCallsBackend(): void
+    {
+        $backend = $this->createMock(BackendInterface::class);
+        $backend->expects(self::once())->method('flush');
+        $cache = new VariableFrontend('someCacheIdentifier', $backend);
+        $cache->flush();
+    }
+
+    #[Test]
+    public function flushByTagRejectsInvalidTags(): void
+    {
+        $this->expectException(\InvalidArgumentException::class);
+        $this->expectExceptionCode(1233057359);
+        $backend = $this->createMock(TaggableBackendInterface::class);
+        $backend->expects(self::never())->method('flushByTag');
+        $cache = new VariableFrontend('someCacheIdentifier', $backend);
+        $cache->flushByTag('SomeInvalid\\Tag');
+    }
+
+    #[Test]
+    public function flushByTagCallsBackendIfItIsATaggableBackend(): void
+    {
+        $tag = 'someTag';
+        $backend = $this->createMock(TaggableBackendInterface::class);
+        $backend->expects(self::once())->method('flushByTag')->with($tag);
+        $cache = new VariableFrontend('someCacheIdentifier', $backend);
+        $cache->flushByTag($tag);
+    }
+
+    #[Test]
+    public function flushByTagsCallsBackendIfItIsATaggableBackend(): void
+    {
+        $tag = 'someTag';
+        $backend = $this->createMock(TaggableBackendInterface::class);
+        $backend->expects(self::once())->method('flushByTags')->with([$tag]);
+        $cache = new VariableFrontend('someCacheIdentifier', $backend);
+        $cache->flushByTags([$tag]);
+    }
+
+    #[Test]
+    public function collectGarbageCallsBackend(): void
+    {
+        $backend = $this->createMock(BackendInterface::class);
+        $backend->expects(self::once())->method('collectGarbage');
+        $cache = new VariableFrontend('someCacheIdentifier', $backend);
+        $cache->collectGarbage();
+    }
+
+    public static function isValidEntryIdentifierReturnsFalseWithValidIdentifierDataProvider(): array
+    {
+        return [
+            [''],
+            ['abc def'],
+            ['foo!'],
+            ['bar:'],
+            ['some/'],
+            ['bla*'],
+            ['one+'],
+            ['äöü'],
+            [str_repeat('x', 251)],
+            ['x$'],
+            ['\\a'],
+            ['b#'],
+        ];
+    }
+
+    #[Test]
+    #[DataProvider('isValidEntryIdentifierReturnsFalseWithValidIdentifierDataProvider')]
+    public function isValidEntryIdentifierReturnsFalseWithValidIdentifier(string $identifier): void
+    {
+        $backend = $this->createMock(BackendInterface::class);
+        $cache = new VariableFrontend('someCacheIdentifier', $backend);
+        self::assertFalse($cache->isValidEntryIdentifier($identifier));
+    }
+
+    public static function isValidEntryIdentifierReturnsTrueWithValidIdentifierDataProvider(): array
+    {
+        return [
+            ['_'],
+            ['abcdef'],
+            ['foo'],
+            ['bar123'],
+            ['3some'],
+            ['_bl_a'],
+            ['some&'],
+            ['one%TWO'],
+            [str_repeat('x', 250)],
+        ];
+    }
+
+    #[Test]
+    #[DataProvider('isValidEntryIdentifierReturnsTrueWithValidIdentifierDataProvider')]
+    public function isValidEntryIdentifierReturnsTrueWithValidIdentifier(string $identifier): void
+    {
+        $backend = $this->createMock(BackendInterface::class);
+        $cache = new VariableFrontend('someCacheIdentifier', $backend);
+        self::assertTrue($cache->isValidEntryIdentifier($identifier));
+    }
+
+    public static function isValidTagReturnsFalseWithInvalidTagDataProvider(): array
+    {
+        return [
+            [''],
+            ['abc def'],
+            ['foo!'],
+            ['bar:'],
+            ['some/'],
+            ['bla*'],
+            ['one+'],
+            ['äöü'],
+            [str_repeat('x', 251)],
+            ['x$'],
+            ['\\a'],
+            ['b#'],
+        ];
+    }
+
+    #[Test]
+    #[DataProvider('isValidTagReturnsFalseWithInvalidTagDataProvider')]
+    public function isValidTagReturnsFalseWithInvalidTag(string $tag): void
+    {
+        $backend = $this->createMock(BackendInterface::class);
+        $cache = new VariableFrontend('someCacheIdentifier', $backend);
+        self::assertFalse($cache->isValidTag($tag));
+    }
+
+    public static function isValidTagReturnsTrueWithValidTagDataProvider(): array
+    {
+        return [
+            ['abcdef'],
+            ['foo-bar'],
+            ['foo_baar'],
+            ['bar123'],
+            ['3some'],
+            ['file%Thing'],
+            ['some&'],
+            ['%x%'],
+            [str_repeat('x', 250)],
+        ];
+    }
+
+    #[Test]
+    #[DataProvider('isValidTagReturnsTrueWithValidTagDataProvider')]
+    public function isValidTagReturnsTrueWithValidTag(string $tag): void
+    {
+        $backend = $this->createMock(BackendInterface::class);
+        $cache = new VariableFrontend('someCacheIdentifier', $backend);
+        self::assertTrue($cache->isValidTag($tag));
+    }
+
     #[Test]
     public function setChecksIfTheIdentifierIsValid(): void
     {
         $this->expectException(\InvalidArgumentException::class);
         $this->expectExceptionCode(1233058264);
-
-        $cache = $this->getMockBuilder(VariableFrontend::class)
-            ->onlyMethods(['isValidEntryIdentifier'])
-            ->disableOriginalConstructor()
-            ->getMock();
-        $cache->expects(self::once())->method('isValidEntryIdentifier')->with('foo')->willReturn(false);
-        $cache->set('foo', 'bar');
+        $cache = new VariableFrontend('someCacheIdentifier', $this->createMock(BackendInterface::class));
+        $cache->set('invalid identifier', 'bar');
     }
 
     #[Test]
     public function setPassesSerializedStringToBackend(): void
     {
         $theString = 'Just some value';
-        $backend = $this->getMockBuilder(AbstractBackend::class)
-            ->onlyMethods(['get', 'set', 'has', 'remove', 'flush', 'collectGarbage'])
-            ->addMethods(['findIdentifiersByTag', 'flushByTag'])
-            ->disableOriginalConstructor()
-            ->getMock();
-        $backend->expects(self::once())->method('set')->with(self::equalTo('VariableCacheTest'), self::equalTo(serialize($theString)));
-
+        $backend = $this->createMock(BackendInterface::class);
+        $backend->expects(self::once())->method('set')->with('VariableCacheTest', serialize($theString));
         $cache = new VariableFrontend('VariableFrontend', $backend);
         $cache->set('VariableCacheTest', $theString);
     }
@@ -57,13 +247,8 @@ final class VariableFrontendTest extends UnitTestCase
     public function setPassesSerializedArrayToBackend(): void
     {
         $theArray = ['Just some value', 'and another one.'];
-        $backend = $this->getMockBuilder(AbstractBackend::class)
-            ->onlyMethods(['get', 'set', 'has', 'remove', 'flush', 'collectGarbage'])
-            ->addMethods(['findIdentifiersByTag', 'flushByTag'])
-            ->disableOriginalConstructor()
-            ->getMock();
-        $backend->expects(self::once())->method('set')->with(self::equalTo('VariableCacheTest'), self::equalTo(serialize($theArray)));
-
+        $backend = $this->createMock(BackendInterface::class);
+        $backend->expects(self::once())->method('set')->with('VariableCacheTest', serialize($theArray));
         $cache = new VariableFrontend('VariableFrontend', $backend);
         $cache->set('VariableCacheTest', $theArray);
     }
@@ -73,13 +258,8 @@ final class VariableFrontendTest extends UnitTestCase
     {
         $theString = 'Just some value';
         $theLifetime = 1234;
-        $backend = $this->getMockBuilder(AbstractBackend::class)
-            ->onlyMethods(['get', 'set', 'has', 'remove', 'flush', 'collectGarbage'])
-            ->addMethods(['findIdentifiersByTag', 'flushByTag'])
-            ->disableOriginalConstructor()
-            ->getMock();
-        $backend->expects(self::once())->method('set')->with(self::equalTo('VariableCacheTest'), self::equalTo(serialize($theString)), self::equalTo([]), self::equalTo($theLifetime));
-
+        $backend = $this->createMock(BackendInterface::class);
+        $backend->expects(self::once())->method('set')->with('VariableCacheTest', serialize($theString), [], $theLifetime);
         $cache = new VariableFrontend('VariableFrontend', $backend);
         $cache->set('VariableCacheTest', $theString, [], $theLifetime);
     }
@@ -87,73 +267,47 @@ final class VariableFrontendTest extends UnitTestCase
     #[Test]
     public function getFetchesStringValueFromBackend(): void
     {
-        $backend = $this->getMockBuilder(AbstractBackend::class)
-            ->onlyMethods(['get', 'set', 'has', 'remove', 'flush', 'collectGarbage'])
-            ->addMethods(['findIdentifiersByTag', 'flushByTag'])
-            ->disableOriginalConstructor()
-            ->getMock();
+        $backend = $this->createMock(BackendInterface::class);
         $backend->expects(self::once())->method('get')->willReturn(serialize('Just some value'));
-
         $cache = new VariableFrontend('VariableFrontend', $backend);
-        self::assertEquals('Just some value', $cache->get('VariableCacheTest'), 'The returned value was not the expected string.');
+        self::assertEquals('Just some value', $cache->get('VariableCacheTest'));
     }
 
     #[Test]
     public function getFetchesArrayValueFromBackend(): void
     {
         $theArray = ['Just some value', 'and another one.'];
-        $backend = $this->getMockBuilder(AbstractBackend::class)
-            ->onlyMethods(['get', 'set', 'has', 'remove', 'flush', 'collectGarbage'])
-            ->addMethods(['findIdentifiersByTag', 'flushByTag'])
-            ->disableOriginalConstructor()
-            ->getMock();
+        $backend = $this->createMock(BackendInterface::class);
         $backend->expects(self::once())->method('get')->willReturn(serialize($theArray));
-
         $cache = new VariableFrontend('VariableFrontend', $backend);
-        self::assertEquals($theArray, $cache->get('VariableCacheTest'), 'The returned value was not the expected unserialized array.');
+        self::assertEquals($theArray, $cache->get('VariableCacheTest'));
     }
 
     #[Test]
     public function getFetchesFalseBooleanValueFromBackend(): void
     {
-        $backend = $this->getMockBuilder(AbstractBackend::class)
-            ->onlyMethods(['get', 'set', 'has', 'remove', 'flush', 'collectGarbage'])
-            ->addMethods(['findIdentifiersByTag', 'flushByTag'])
-            ->disableOriginalConstructor()
-            ->getMock();
+        $backend = $this->createMock(BackendInterface::class);
         $backend->expects(self::once())->method('get')->willReturn(serialize(false));
-
         $cache = new VariableFrontend('VariableFrontend', $backend);
-        self::assertFalse($cache->get('VariableCacheTest'), 'The returned value was not the FALSE.');
+        self::assertFalse($cache->get('VariableCacheTest'));
     }
 
     #[Test]
     public function hasReturnsResultFromBackend(): void
     {
-        $backend = $this->getMockBuilder(AbstractBackend::class)
-            ->onlyMethods(['get', 'set', 'has', 'remove', 'flush', 'collectGarbage'])
-            ->addMethods(['findIdentifiersByTag', 'flushByTag'])
-            ->disableOriginalConstructor()
-            ->getMock();
+        $backend = $this->createMock(BackendInterface::class);
         $backend->expects(self::once())->method('has')->with(self::equalTo('VariableCacheTest'))->willReturn(true);
-
         $cache = new VariableFrontend('VariableFrontend', $backend);
-        self::assertTrue($cache->has('VariableCacheTest'), 'has() did not return TRUE.');
+        self::assertTrue($cache->has('VariableCacheTest'));
     }
 
     #[Test]
     public function removeCallsBackend(): void
     {
         $cacheIdentifier = 'someCacheIdentifier';
-        $backend = $this->getMockBuilder(AbstractBackend::class)
-            ->onlyMethods(['get', 'set', 'has', 'remove', 'flush', 'collectGarbage'])
-            ->addMethods(['findIdentifiersByTag', 'flushByTag'])
-            ->disableOriginalConstructor()
-            ->getMock();
-
+        $backend = $this->createMock(BackendInterface::class);
         $backend->expects(self::once())->method('remove')->with(self::equalTo($cacheIdentifier))->willReturn(true);
-
         $cache = new VariableFrontend('VariableFrontend', $backend);
-        self::assertTrue($cache->remove($cacheIdentifier), 'remove() did not return TRUE');
+        self::assertTrue($cache->remove($cacheIdentifier));
     }
 }
-- 
GitLab