diff -pruN 2.10.0-3/.github/workflows/tests.yml 2.13.0-1/.github/workflows/tests.yml
--- 2.10.0-3/.github/workflows/tests.yml	2024-02-11 07:24:16.000000000 +0000
+++ 2.13.0-1/.github/workflows/tests.yml	2025-03-19 20:58:51.000000000 +0000
@@ -13,6 +13,7 @@ jobs:
     strategy:
       matrix:
         php-version:
+          - '8.4'
           - '8.3'
           - '8.2'
           - '8.1'
@@ -23,6 +24,12 @@ jobs:
           - '7.1'
           - '7.0'
         phpunit-version:
+          - '12.0.0'
+          - '11.5.0'
+          - '11.4.0'
+          - '11.3.0'
+          - '11.2.0'
+          - '11.1.0'
           - '11.0.0'
           - '10.5.0'
           - '10.4.0'
@@ -56,6 +63,52 @@ jobs:
           - '6.0.0'
 
         exclude:
+          # PHP 8.4 Exclusions
+          - php-version: '8.4'
+            phpunit-version: '9.4.0'
+          - php-version: '8.4'
+            phpunit-version: '9.3.0'
+          - php-version: '8.4'
+            phpunit-version: '9.2.0'
+          - php-version: '8.4'
+            phpunit-version: '9.1.0'
+          - php-version: '8.4'
+            phpunit-version: '9.0.0'
+          - php-version: '8.4'
+            phpunit-version: '8.4.0'
+          - php-version: '8.4'
+            phpunit-version: '8.3.0'
+          - php-version: '8.4'
+            phpunit-version: '8.2.0'
+          - php-version: '8.4'
+            phpunit-version: '8.1.0'
+          - php-version: '8.4'
+            phpunit-version: '8.0.0'
+          - php-version: '8.4'
+            phpunit-version: '7.5.0'
+          - php-version: '8.4'
+            phpunit-version: '7.4.0'
+          - php-version: '8.4'
+            phpunit-version: '7.3.0'
+          - php-version: '8.4'
+            phpunit-version: '7.2.0'
+          - php-version: '8.4'
+            phpunit-version: '7.1.0'
+          - php-version: '8.4'
+            phpunit-version: '7.0.0'
+          - php-version: '8.4'
+            phpunit-version: '6.5.0'
+          - php-version: '8.4'
+            phpunit-version: '6.4.0'
+          - php-version: '8.4'
+            phpunit-version: '6.3.0'
+          - php-version: '8.4'
+            phpunit-version: '6.2.0'
+          - php-version: '8.4'
+            phpunit-version: '6.1.0'
+          - php-version: '8.4'
+            phpunit-version: '6.0.0'
+        
           # PHP 8.3 Exclusions
           - php-version: '8.3'
             phpunit-version: '9.4.0'
@@ -104,6 +157,8 @@ jobs:
 
           # PHP 8.2 Exclusions
           - php-version: '8.2'
+            phpunit-version: '12.0.0'
+          - php-version: '8.2'
             phpunit-version: '9.4.0'
           - php-version: '8.2'
             phpunit-version: '9.3.0'
@@ -150,6 +205,18 @@ jobs:
 
           # PHP 8.1 Exclusions
           - php-version: '8.1'
+            phpunit-version: '12.0.0'
+          - php-version: '8.1'
+            phpunit-version: '11.5.0'
+          - php-version: '8.1'
+            phpunit-version: '11.4.0'
+          - php-version: '8.1'
+            phpunit-version: '11.3.0'
+          - php-version: '8.1'
+            phpunit-version: '11.2.0'
+          - php-version: '8.1'
+            phpunit-version: '11.1.0'
+          - php-version: '8.1'
             phpunit-version: '11.0.0'
           - php-version: '8.1'
             phpunit-version: '9.4.0'
@@ -198,6 +265,18 @@ jobs:
 
           # PHP 8.0 Exclusions
           - php-version: '8.0'
+            phpunit-version: '12.0.0'
+          - php-version: '8.0'
+            phpunit-version: '11.5.0'
+          - php-version: '8.0'
+            phpunit-version: '11.4.0'
+          - php-version: '8.0'
+            phpunit-version: '11.3.0'
+          - php-version: '8.0'
+            phpunit-version: '11.2.0'
+          - php-version: '8.0'
+            phpunit-version: '11.1.0'
+          - php-version: '8.0'
             phpunit-version: '11.0.0'
           - php-version: '8.0'
             phpunit-version: '10.5.0'
@@ -254,6 +333,18 @@ jobs:
             
           # PHP 7.4 Exclusions
           - php-version: '7.4'
+            phpunit-version: '12.0.0'
+          - php-version: '7.4'
+            phpunit-version: '11.5.0'
+          - php-version: '7.4'
+            phpunit-version: '11.4.0'
+          - php-version: '7.4'
+            phpunit-version: '11.3.0'
+          - php-version: '7.4'
+            phpunit-version: '11.2.0'
+          - php-version: '7.4'
+            phpunit-version: '11.1.0'
+          - php-version: '7.4'
             phpunit-version: '11.0.0'
           - php-version: '7.4'
             phpunit-version: '10.5.0'
@@ -296,6 +387,18 @@ jobs:
 
           # PHP 7.3 Exclusions
           - php-version: '7.3'
+            phpunit-version: '12.0.0'
+          - php-version: '7.3'
+            phpunit-version: '11.5.0'
+          - php-version: '7.3'
+            phpunit-version: '11.4.0'
+          - php-version: '7.3'
+            phpunit-version: '11.3.0'
+          - php-version: '7.3'
+            phpunit-version: '11.2.0'
+          - php-version: '7.3'
+            phpunit-version: '11.1.0'
+          - php-version: '7.3'
             phpunit-version: '11.0.0'
           - php-version: '7.3'
             phpunit-version: '10.5.0'
@@ -312,6 +415,18 @@ jobs:
           
           # PHP 7.2 Exclusions
           - php-version: '7.2'
+            phpunit-version: '12.0.0'
+          - php-version: '7.2'
+            phpunit-version: '11.5.0'
+          - php-version: '7.2'
+            phpunit-version: '11.4.0'
+          - php-version: '7.2'
+            phpunit-version: '11.3.0'
+          - php-version: '7.2'
+            phpunit-version: '11.2.0'
+          - php-version: '7.2'
+            phpunit-version: '11.1.0'
+          - php-version: '7.2'
             phpunit-version: '11.0.0'
           - php-version: '7.2'
             phpunit-version: '10.5.0'
@@ -342,6 +457,18 @@ jobs:
           
           # PHP 7.1 Exclusions
           - php-version: '7.1'
+            phpunit-version: '12.0.0'
+          - php-version: '7.1'
+            phpunit-version: '11.5.0'
+          - php-version: '7.1'
+            phpunit-version: '11.4.0'
+          - php-version: '7.1'
+            phpunit-version: '11.3.0'
+          - php-version: '7.1'
+            phpunit-version: '11.2.0'
+          - php-version: '7.1'
+            phpunit-version: '11.1.0'
+          - php-version: '7.1'
             phpunit-version: '11.0.0'
           - php-version: '7.1'
             phpunit-version: '10.5.0'
@@ -384,6 +511,18 @@ jobs:
       
           # PHP 7.0 Exclusions
           - php-version: '7.0'
+            phpunit-version: '12.0.0'
+          - php-version: '7.0'
+            phpunit-version: '11.5.0'
+          - php-version: '7.0'
+            phpunit-version: '11.4.0'
+          - php-version: '7.0'
+            phpunit-version: '11.3.0'
+          - php-version: '7.0'
+            phpunit-version: '11.2.0'
+          - php-version: '7.0'
+            phpunit-version: '11.1.0'
+          - php-version: '7.0'
             phpunit-version: '11.0.0'
           - php-version: '7.0'
             phpunit-version: '10.5.0'
diff -pruN 2.10.0-3/autoload.php 2.13.0-1/autoload.php
--- 2.10.0-3/autoload.php	2024-02-11 07:24:16.000000000 +0000
+++ 2.13.0-1/autoload.php	2025-03-19 20:58:51.000000000 +0000
@@ -29,10 +29,17 @@ if (! interface_exists(\PHPUnit\Framewor
 }
 
 if (! class_exists(\PHPUnit\Framework\MockObject\Builder\InvocationMocker::class)) {
-    class_alias(
-        \PHPUnit_Framework_MockObject_Builder_InvocationMocker::class,
-        \PHPUnit\Framework\MockObject\Builder\InvocationMocker::class
-    );
+    if (class_exists(\PHPUnit\Framework\MockObject\InvocationStubberImplementation::class)) {
+        class_alias(
+            \PHPUnit\Framework\MockObject\InvocationStubberImplementation::class,
+            \PHPUnit\Framework\MockObject\Builder\InvocationMocker::class
+        );
+    } else {
+        class_alias(
+            \PHPUnit_Framework_MockObject_Builder_InvocationMocker::class,
+            \PHPUnit\Framework\MockObject\Builder\InvocationMocker::class
+        );
+    }
 }
 
 if (class_exists(\PHPUnit\Framework\MockObject\Rule\MethodName::class)) {
@@ -90,6 +97,11 @@ if ($hasVersion
 }
 
 if ($hasVersion
+    && version_compare(\PHPUnit\Runner\Version::id(), '12.0.0') >= 0
+) {
+    class_alias(\phpmock\phpunit\DefaultArgumentRemoverReturnTypes120::class, \phpmock\phpunit\DefaultArgumentRemover::class);
+    class_alias(\phpmock\phpunit\MockObjectProxyReturnTypes120::class, \phpmock\phpunit\MockObjectProxy::class);
+} elseif ($hasVersion
     && version_compare(\PHPUnit\Runner\Version::id(), '10.0.0') >= 0
 ) {
     class_alias(\phpmock\phpunit\DefaultArgumentRemoverReturnTypes100::class, \phpmock\phpunit\DefaultArgumentRemover::class);
diff -pruN 2.10.0-3/classes/DefaultArgumentRemoverReturnTypes120.php 2.13.0-1/classes/DefaultArgumentRemoverReturnTypes120.php
--- 2.10.0-3/classes/DefaultArgumentRemoverReturnTypes120.php	1970-01-01 00:00:00.000000000 +0000
+++ 2.13.0-1/classes/DefaultArgumentRemoverReturnTypes120.php	2025-03-19 20:58:51.000000000 +0000
@@ -0,0 +1,128 @@
+<?php
+
+namespace phpmock\phpunit;
+
+use phpmock\generator\MockFunctionGenerator;
+use PHPUnit\Framework\MockObject\Invocation;
+use PHPUnit\Framework\MockObject\Rule\InvocationOrder;
+use ReflectionClass;
+
+/**
+ * Removes default arguments from the invocation.
+ *
+ * @author Markus Malkusch <markus@malkusch.de>
+ * @link bitcoin:1335STSwu9hST4vcMRppEPgENMHD2r1REK Donations
+ * @license http://www.wtfpl.net/txt/copying/ WTFPL
+ * @internal
+ */
+class DefaultArgumentRemoverReturnTypes120 extends InvocationOrder
+{
+    /**
+     * @SuppressWarnings(PHPMD)
+     */
+    public function invokedDo(Invocation $invocation): void
+    {
+    }
+
+    /**
+     * @SuppressWarnings(PHPMD)
+     */
+    public function matches(Invocation $invocation) : bool
+    {
+        $iClass = class_exists(Invocation::class);
+
+        if ($iClass
+            || $invocation instanceof Invocation\StaticInvocation
+        ) {
+            $this->removeDefaultArguments(
+                $invocation,
+                $iClass ? Invocation::class : Invocation\StaticInvocation::class
+            );
+        } elseif (!$this->shouldRemoveDefaultArgumentsWithReflection($invocation)) {
+            MockFunctionGenerator::removeDefaultArguments($invocation->parameters);
+        }
+
+        return false;
+    }
+
+    public function verify() : void
+    {
+    }
+
+    /**
+     * This method is not defined in the interface, but used in
+     * PHPUnit_Framework_MockObject_InvocationMocker::hasMatchers().
+     *
+     * @return boolean
+     * @see \PHPUnit_Framework_MockObject_InvocationMocker::hasMatchers()
+     */
+    public function hasMatchers()
+    {
+        return false;
+    }
+
+    public function toString() : string
+    {
+        return __CLASS__;
+    }
+
+    /**
+     * Remove default arguments from StaticInvocation or its children (hack)
+     *
+     * @SuppressWarnings(PHPMD)
+     */
+    private function removeDefaultArguments(Invocation $invocation, string $class)
+    {
+        if ($this->shouldRemoveDefaultArgumentsWithReflection($invocation)) {
+            return;
+        }
+
+        $remover = function () {
+            MockFunctionGenerator::removeDefaultArguments($this->parameters);
+        };
+
+        $remover->bindTo($invocation, $class)();
+    }
+
+    /**
+     * Alternative to remove default arguments from StaticInvocation or its children (hack)
+     *
+     * @SuppressWarnings(PHPMD.StaticAccess)
+     */
+    public static function removeDefaultArgumentsWithReflection(Invocation $invocation): Invocation
+    {
+        if (!(new self())->shouldRemoveDefaultArgumentsWithReflection($invocation)) {
+            return $invocation;
+        }
+
+        $reflection = new ReflectionClass($invocation);
+
+        $reflectionReturnType = $reflection->getProperty('returnType');
+        $reflectionReturnType->setAccessible(true);
+
+        $reflectionIsOptional = $reflection->getProperty('isReturnTypeNullable');
+        $reflectionIsOptional->setAccessible(true);
+
+        $returnType = $reflectionReturnType->getValue($invocation);
+
+        if ($reflectionIsOptional->getValue($invocation)) {
+            $returnType = '?' . $returnType;
+        }
+
+        $parameters = $invocation->parameters();
+        MockFunctionGenerator::removeDefaultArguments($parameters);
+
+        return new Invocation(
+            $invocation->className(),
+            $invocation->methodName(),
+            $parameters,
+            $returnType,
+            $invocation->object()
+        );
+    }
+
+    protected function shouldRemoveDefaultArgumentsWithReflection(Invocation $invocation)
+    {
+        return method_exists($invocation, 'parameters');
+    }
+}
diff -pruN 2.10.0-3/classes/MockDisablerPHPUnit10.php 2.13.0-1/classes/MockDisablerPHPUnit10.php
--- 2.10.0-3/classes/MockDisablerPHPUnit10.php	2024-02-11 07:24:16.000000000 +0000
+++ 2.13.0-1/classes/MockDisablerPHPUnit10.php	2025-03-19 20:58:51.000000000 +0000
@@ -2,6 +2,7 @@
 
 namespace phpmock\phpunit;
 
+use Closure;
 use phpmock\Deactivatable;
 use PHPUnit\Event\Test\Finished;
 use PHPUnit\Event\Test\FinishedSubscriber;
@@ -22,15 +23,22 @@ class MockDisablerPHPUnit10 implements F
      * @var Deactivatable The function mocks.
      */
     private $deactivatable;
+
+    /**
+     * @var Closure|null The callback to execute after the test.
+     */
+    private $callback;
     
     /**
      * Sets the function mocks.
      *
      * @param Deactivatable $deactivatable The function mocks.
+     * @param Closure|null $callback       The callback to execute after the test.
      */
-    public function __construct(Deactivatable $deactivatable)
+    public function __construct(Deactivatable $deactivatable, ?Closure $callback = null)
     {
         $this->deactivatable = $deactivatable;
+        $this->callback = $callback;
     }
 
     /**
@@ -39,10 +47,16 @@ class MockDisablerPHPUnit10 implements F
     public function notify(Finished $event) : void
     {
         $this->deactivatable->disable();
+        if ($this->callback !== null) {
+            ($this->callback)($this);
+        }
     }
 
     public function endTest(): void
     {
         $this->deactivatable->disable();
+        if ($this->callback !== null) {
+            ($this->callback)($this);
+        }
     }
 }
diff -pruN 2.10.0-3/classes/MockDisablerPHPUnit6.php 2.13.0-1/classes/MockDisablerPHPUnit6.php
--- 2.10.0-3/classes/MockDisablerPHPUnit6.php	2024-02-11 07:24:16.000000000 +0000
+++ 2.13.0-1/classes/MockDisablerPHPUnit6.php	2025-03-19 20:58:51.000000000 +0000
@@ -2,6 +2,7 @@
 
 namespace phpmock\phpunit;
 
+use Closure;
 use phpmock\Deactivatable;
 use PHPUnit\Framework\BaseTestListener;
 use PHPUnit\Framework\Test;
@@ -22,15 +23,22 @@ class MockDisablerPHPUnit6 extends BaseT
      * @var Deactivatable The function mocks.
      */
     private $deactivatable;
+
+    /**
+     * @var Closure|null The callback to execute after the test.
+     */
+    private $callback;
     
     /**
      * Sets the function mocks.
      *
      * @param Deactivatable $deactivatable The function mocks.
+     * @param Closure|null $callback       The callback to execute after the test.
      */
-    public function __construct(Deactivatable $deactivatable)
+    public function __construct(Deactivatable $deactivatable, Closure $callback = null)
     {
         $this->deactivatable = $deactivatable;
+        $this->callback = $callback;
     }
     
     /**
@@ -46,5 +54,8 @@ class MockDisablerPHPUnit6 extends BaseT
         parent::endTest($test, $time);
         
         $this->deactivatable->disable();
+        if ($this->callback !== null) {
+            ($this->callback)($this);
+        }
     }
 }
diff -pruN 2.10.0-3/classes/MockDisablerPHPUnit7.php 2.13.0-1/classes/MockDisablerPHPUnit7.php
--- 2.10.0-3/classes/MockDisablerPHPUnit7.php	2024-02-11 07:24:16.000000000 +0000
+++ 2.13.0-1/classes/MockDisablerPHPUnit7.php	2025-03-19 20:58:51.000000000 +0000
@@ -2,6 +2,7 @@
 
 namespace phpmock\phpunit;
 
+use Closure;
 use phpmock\Deactivatable;
 use PHPUnit\Framework\BaseTestListener;
 use PHPUnit\Framework\Test;
@@ -22,15 +23,22 @@ class MockDisablerPHPUnit7 extends BaseT
      * @var Deactivatable The function mocks.
      */
     private $deactivatable;
+
+    /**
+     * @var Closure|null The callback to execute after the test.
+     */
+    private $callback;
     
     /**
      * Sets the function mocks.
      *
      * @param Deactivatable $deactivatable The function mocks.
+     * @param Closure|null $callback       The callback to execute after the test.
      */
-    public function __construct(Deactivatable $deactivatable)
+    public function __construct(Deactivatable $deactivatable, Closure $callback = null)
     {
         $this->deactivatable = $deactivatable;
+        $this->callback = $callback;
     }
     
     /**
@@ -46,5 +54,8 @@ class MockDisablerPHPUnit7 extends BaseT
         parent::endTest($test, $time);
         
         $this->deactivatable->disable();
+        if ($this->callback !== null) {
+            ($this->callback)($this);
+        }
     }
 }
diff -pruN 2.10.0-3/classes/MockObjectProxyReturnTypes120.php 2.13.0-1/classes/MockObjectProxyReturnTypes120.php
--- 2.10.0-3/classes/MockObjectProxyReturnTypes120.php	1970-01-01 00:00:00.000000000 +0000
+++ 2.13.0-1/classes/MockObjectProxyReturnTypes120.php	2025-03-19 20:58:51.000000000 +0000
@@ -0,0 +1,100 @@
+<?php
+
+namespace phpmock\phpunit;
+
+use phpmock\integration\MockDelegateFunctionBuilder;
+use PHPUnit\Framework\Constraint\Constraint;
+use PHPUnit\Framework\MockObject\InvocationStubberImplementation as BuilderInvocationMocker;
+use PHPUnit\Framework\MockObject\InvocationStubber;
+use PHPUnit\Framework\MockObject\InvocationHandler;
+use PHPUnit\Framework\MockObject\MockObject;
+use PHPUnit\Framework\MockObject\Rule\InvocationOrder;
+use PHPUnit\Framework\MockObject\Runtime\PropertyHook;
+
+/**
+ * Proxy for PHPUnit's PHPUnit_Framework_MockObject_MockObject.
+ *
+ * @author Markus Malkusch <markus@malkusch.de>
+ * @link bitcoin:1335STSwu9hST4vcMRppEPgENMHD2r1REK Donations
+ * @license http://www.wtfpl.net/txt/copying/ WTFPL
+ * @internal
+ */
+class MockObjectProxyReturnTypes120 implements MockObject
+{
+    /**
+     * @var MockObject $mockObject The mock object.
+     */
+    private $mockObject;
+
+    /**
+     * Inject the subject.
+     *
+     * @param MockObject $mockObject   The subject.
+     */
+    public function __construct(MockObject $mockObject)
+    {
+        $this->mockObject = $mockObject;
+    }
+
+    /**
+     * @SuppressWarnings(PHPMD)
+     */
+    // @codingStandardsIgnoreStart
+    public function __phpunit_getInvocationHandler(): InvocationHandler
+    {
+        return $this->mockObject->__phpunit_getInvocationHandler();
+    }
+
+    /**
+     * @SuppressWarnings(PHPMD)
+     */
+    // @codingStandardsIgnoreStart
+    public function __phpunit_setOriginalObject(object $originalObject) : void
+    {
+        // @codingStandardsIgnoreEnd
+        $this->mockObject->__phpunit_setOriginalObject($originalObject);
+    }
+
+    /**
+     * @SuppressWarnings(PHPMD)
+     */
+    // @codingStandardsIgnoreStart
+    public function __phpunit_verify(bool $unsetInvocationMocker = true) : void
+    {
+        // @codingStandardsIgnoreEnd
+        $this->mockObject->__phpunit_verify($unsetInvocationMocker);
+    }
+
+    public function expects(InvocationOrder $matcher) : BuilderInvocationMocker
+    {
+        return $this->mockObject->expects($matcher)->method(MockDelegateFunctionBuilder::METHOD);
+    }
+
+    public function method(Constraint|PropertyHook|string $constraint): InvocationStubber
+    {
+        return $this->mockObject->method($constraint);
+    }
+
+    /**
+     * This method is not part of the contract but was found in
+     * PHPUnit's mocked_class.tpl.dist.
+     *
+     * @SuppressWarnings(PHPMD)
+     */
+    // @codingStandardsIgnoreStart
+    public function __phpunit_hasMatchers() : bool
+    {
+        // @codingStandardsIgnoreEnd
+        return $this->mockObject->__phpunit_hasMatchers();
+    }
+
+    /**
+     * @SuppressWarnings(PHPMD)
+     */
+    // @codingStandardsIgnoreStart
+    public function __phpunit_setReturnValueGeneration(bool $returnValueGeneration) : void
+    {
+        // @codingStandardsIgnoreEnd
+        $this->mockObject->__phpunit_setReturnValueGeneration($returnValueGeneration);
+    }
+}
diff -pruN 2.10.0-3/classes/PHPMock.php 2.13.0-1/classes/PHPMock.php
--- 2.10.0-3/classes/PHPMock.php	2024-02-11 07:24:16.000000000 +0000
+++ 2.13.0-1/classes/PHPMock.php	2025-03-19 20:58:51.000000000 +0000
@@ -7,8 +7,10 @@ use phpmock\integration\MockDelegateFunc
 use phpmock\MockBuilder;
 use phpmock\Deactivatable;
 use PHPUnit\Event\Facade;
+use PHPUnit\Event\Test\Finished;
 use PHPUnit\Framework\MockObject\MockObject;
 use ReflectionClass;
+use ReflectionMethod;
 use ReflectionProperty;
 use SebastianBergmann\Template\Template;
 
@@ -66,10 +68,12 @@ trait PHPMock
         $delegateBuilder->build($name);
 
         $builder = $this->getMockBuilder($delegateBuilder->getFullyQualifiedClassName());
-        if (is_callable([$builder, 'addMethods'])) {
-            $builder->addMethods([$name]);
+        if (is_callable([$builder, 'onlyMethods'])) {
+            $builder->onlyMethods([MockDelegateFunctionBuilder::METHOD, $name]);
+        } elseif (is_callable([$builder, 'setMethods'])) {
+            $builder->setMethods([MockDelegateFunctionBuilder::METHOD, $name]);
         }
-        $mock = $builder->getMockForAbstractClass();
+        $mock = $builder->getMock();
         $this->addMatcher($mock, $name);
 
         $functionMockBuilder = new MockBuilder();
@@ -115,8 +119,32 @@ trait PHPMock
             $property->setAccessible(true);
             $property->setValue($facade, false);
 
+            $method = new ReflectionMethod($facade, 'deferredDispatcher');
+            $method->setAccessible(true);
+            $dispatcher = $method->invoke($facade);
+
+            $propDispatcher = new ReflectionProperty($dispatcher, 'dispatcher');
+            $propDispatcher->setAccessible(true);
+            $directDispatcher = $propDispatcher->getValue($dispatcher);
+
+            $propSubscribers = new ReflectionProperty($directDispatcher, 'subscribers');
+            $propSubscribers->setAccessible(true);
+
             $facade->registerSubscriber(
-                new MockDisabler($deactivatable)
+                new MockDisabler(
+                    $deactivatable,
+                    static function (MockDisabler $original) use ($directDispatcher, $propSubscribers) {
+                        $subscribers = $propSubscribers->getValue($directDispatcher);
+
+                        foreach ($subscribers[Finished::class] as $key => $subscriber) {
+                            if ($original === $subscriber) {
+                                unset($subscribers[Finished::class][$key]);
+                            }
+                        }
+
+                        $propSubscribers->setValue($directDispatcher, $subscribers);
+                    }
+                )
             );
 
             $property->setValue($facade, true);
@@ -125,7 +153,9 @@ trait PHPMock
         }
 
         $result = $this->getTestResultObject();
-        $result->addListener(new MockDisabler($deactivatable));
+        $result->addListener(new MockDisabler($deactivatable, static function (MockDisabler $listener) use ($result) {
+            $result->removeListener($listener);
+        }));
     }
 
     /**
@@ -199,8 +229,9 @@ trait PHPMock
         }
 
         $mockMethodClasses = [
-            'PHPUnit\\Framework\\MockObject\\Generator\\MockMethod',
-            'PHPUnit\\Framework\\MockObject\\MockMethod',
+            'PHPUnit\\Framework\\MockObject\\Generator\\DoubledMethod', // PHPUnit 12
+            'PHPUnit\\Framework\\MockObject\\Generator\\MockMethod',    // PHPUnit 10-11
+            'PHPUnit\\Framework\\MockObject\\MockMethod',               // PHPUnit 9
         ];
 
         foreach ($mockMethodClasses as $mockMethodClass) {
diff -pruN 2.10.0-3/composer.json 2.13.0-1/composer.json
--- 2.10.0-3/composer.json	2024-02-11 07:24:16.000000000 +0000
+++ 2.13.0-1/composer.json	2025-03-19 20:58:51.000000000 +0000
@@ -19,8 +19,8 @@
     },
     "require": {
         "php": ">=7",
-        "phpunit/phpunit": "^6 || ^7 || ^8 || ^9 || ^10.0.17 || ^11",
-        "php-mock/php-mock-integration": "^2.3"
+        "phpunit/phpunit": "^6 || ^7 || ^8 || ^9 || ^10.0.17 || ^11 || ^12.0.9",
+        "php-mock/php-mock-integration": "^3.0"
     },
     "require-dev": {
         "mockery/mockery": "^1.3.6"
diff -pruN 2.10.0-3/debian/autoload.php.tpl 2.13.0-1/debian/autoload.php.tpl
--- 2.10.0-3/debian/autoload.php.tpl	2025-01-04 17:36:51.000000000 +0000
+++ 2.13.0-1/debian/autoload.php.tpl	2025-09-20 20:45:31.000000000 +0000
@@ -21,29 +21,4 @@ spl_autoload_register(
     true,
     false
 );
-
-class_alias(
-    \PHPUnit\Framework\MockObject\Rule\InvocationOrder::class,
-    \PHPUnit\Framework\MockObject\Matcher\Invocation::class
-);
-
-class_alias(
-    \PHPUnit\Framework\MockObject\Rule\MethodName::class,
-    \PHPUnit\Framework\MockObject\Matcher\MethodName::class
-);
-
-class_alias(
-    phpmock\phpunit\MockDisablerPHPUnit10::class,
-    phpmock\phpunit\MockDisabler::class
-);
-
-class_alias(
-    \phpmock\phpunit\DefaultArgumentRemoverReturnTypes100::class,
-    \phpmock\phpunit\DefaultArgumentRemover::class
-);
-
-class_alias(
-    \phpmock\phpunit\MockObjectProxyReturnTypes100::class,
-    \phpmock\phpunit\MockObjectProxy::class
-);
 // @codeCoverageIgnoreEnd
diff -pruN 2.10.0-3/debian/changelog 2.13.0-1/debian/changelog
--- 2.10.0-3/debian/changelog	2025-01-16 10:07:17.000000000 +0000
+++ 2.13.0-1/debian/changelog	2025-09-20 20:45:59.000000000 +0000
@@ -1,3 +1,11 @@
+php-mock-phpunit (2.13.0-1) unstable; urgency=medium
+
+  * Team upload
+  * New upstream version 2.13.0
+  * Adapt class aliases to PHPUnit version
+
+ -- Robin Gustafsson <rgson@debian.org>  Sat, 20 Sep 2025 22:45:59 +0200
+
 php-mock-phpunit (2.10.0-3) unstable; urgency=medium
 
   * Team upload
diff -pruN 2.10.0-3/debian/control 2.13.0-1/debian/control
--- 2.10.0-3/debian/control	2025-01-16 10:05:00.000000000 +0000
+++ 2.13.0-1/debian/control	2025-09-20 20:45:31.000000000 +0000
@@ -6,7 +6,7 @@ Uploaders: James Valleroy <jvalleroy@mai
 Build-Depends: debhelper-compat (= 13),
                php-mbstring,
                php-mock (>= 2.4.0),
-               php-mock-integration,
+               php-mock-integration (>= 3),
                php-mockery,
                php-phpspec-prophecy,
                phpab,
diff -pruN 2.10.0-3/debian/patches/0001-Skip-test-inherited-from-php-mock.patch 2.13.0-1/debian/patches/0001-Skip-test-inherited-from-php-mock.patch
--- 2.10.0-3/debian/patches/0001-Skip-test-inherited-from-php-mock.patch	2025-01-04 17:36:51.000000000 +0000
+++ 2.13.0-1/debian/patches/0001-Skip-test-inherited-from-php-mock.patch	2025-09-20 20:45:31.000000000 +0000
@@ -7,12 +7,12 @@ Subject: Skip test inherited from php-mo
  1 file changed, 8 insertions(+)
 
 diff --git a/tests/PHPMockTest.php b/tests/PHPMockTest.php
-index da26159..c81ca07 100644
+index 582b1c7..b4a7331 100644
 --- a/tests/PHPMockTest.php
 +++ b/tests/PHPMockTest.php
-@@ -63,4 +63,12 @@ class PHPMockTest extends AbstractMockTestCase
-             time(); // satisfy the expectation
-         }
+@@ -123,4 +123,12 @@ class PHPMockTest extends AbstractMockTestCase
+     {
+         self::assertSame(1, $obj->count);
      }
 +
 +    /* Skipping these tests for the Debian package, not clear why they are failing. */
diff -pruN 2.10.0-3/debian/rules 2.13.0-1/debian/rules
--- 2.10.0-3/debian/rules	2025-01-04 17:36:51.000000000 +0000
+++ 2.13.0-1/debian/rules	2025-09-20 20:45:31.000000000 +0000
@@ -8,6 +8,7 @@ override_dh_auto_build:
 	phpab	--output debian-autoload.php \
 		--template debian/autoload.php.tpl \
 		classes/ tests/
+	tail -n+2 autoload.php >> debian-autoload.php
 	cp debian-autoload.php debian/autoload.php
 	# Workaround to ensure the local class takes precedence during tests.
 	mkdir --parents phpmock/phpunit
diff -pruN 2.10.0-3/tests/MockDisablerTest.php 2.13.0-1/tests/MockDisablerTest.php
--- 2.10.0-3/tests/MockDisablerTest.php	2024-02-11 07:24:16.000000000 +0000
+++ 2.13.0-1/tests/MockDisablerTest.php	2025-03-19 20:58:51.000000000 +0000
@@ -2,6 +2,7 @@
 
 namespace phpmock\phpunit;
 
+use phpmock\Deactivatable;
 use phpmock\Mock;
 use PHPUnit\Framework\TestCase;
 
@@ -32,4 +33,22 @@ class MockDisablerTest extends TestCase
         
         $this->assertEquals(1, min(1, 9));
     }
+
+    public function testCallback()
+    {
+        $executed = false;
+        $executedWith = null;
+        $mock = $this->createMock(Deactivatable::class);
+        $disabler = new MockDisabler($mock, static function ($disabler) use (&$executed, &$executedWith) {
+            self::assertInstanceOf(MockDisabler::class, $disabler);
+
+            $executed = true;
+            $executedWith = $disabler;
+        });
+
+        $disabler->endTest($this, 1);
+
+        self::assertTrue($executed);
+        self::assertSame($executedWith, $disabler);
+    }
 }
diff -pruN 2.10.0-3/tests/MockObjectProxyTest.php 2.13.0-1/tests/MockObjectProxyTest.php
--- 2.10.0-3/tests/MockObjectProxyTest.php	2024-02-11 07:24:16.000000000 +0000
+++ 2.13.0-1/tests/MockObjectProxyTest.php	2025-03-19 20:58:51.000000000 +0000
@@ -4,6 +4,7 @@ namespace phpmock\phpunit;
 
 use Mockery;
 use phpmock\integration\MockDelegateFunctionBuilder;
+use PHPUnit\Framework\Attributes\DataProvider;
 use PHPUnit\Framework\MockObject\Builder\InvocationMocker;
 use PHPUnit\Framework\MockObject\ConfigurableMethod;
 use PHPUnit\Framework\MockObject\InvocationHandler;
@@ -137,6 +138,7 @@ class MockObjectProxyTest extends TestCa
      * @test
      * @dataProvider provideTestProxiedMethods
      */
+    #[DataProvider('provideTestProxiedMethods')]
     public function testProxiedMethods($method, array $arguments = [], $expected = null)
     {
         $mock = Mockery::mock(MockObject::class);
diff -pruN 2.10.0-3/tests/PHPMockTest.php 2.13.0-1/tests/PHPMockTest.php
--- 2.10.0-3/tests/PHPMockTest.php	2024-02-11 07:24:16.000000000 +0000
+++ 2.13.0-1/tests/PHPMockTest.php	2025-03-19 20:58:51.000000000 +0000
@@ -3,6 +3,7 @@
 namespace phpmock\phpunit;
 
 use phpmock\AbstractMockTestCase;
+use phpmock\Deactivatable;
 use PHPUnit\Framework\ExpectationFailedException;
 
 /**
@@ -63,4 +64,63 @@ class PHPMockTest extends AbstractMockTe
             time(); // satisfy the expectation
         }
     }
+
+    /**
+     * Register a Deactivatable for a tear down.
+     *
+     * @test
+     */
+    public function testRegisterForTearDownRegistered()
+    {
+        $obj = new \stdClass();
+        $obj->count = 0;
+
+        $class = new class ($obj) implements Deactivatable
+        {
+            private $obj;
+
+            public function __construct($obj)
+            {
+                $this->obj = $obj;
+            }
+
+            public function disable()
+            {
+                ++$this->obj->count;
+            }
+        };
+        $this->registerForTearDown($class);
+
+        self::assertSame(0, $obj->count);
+
+        return $obj;
+    }
+
+    /**
+     * Check the Deactivatable was executed on a tear down of dependent test.
+     *
+     * @test
+     *
+     * @depends testRegisterForTearDownRegistered
+     */
+    #[\PHPUnit\Framework\Attributes\Depends('testRegisterForTearDownRegistered')]
+    public function testRegisterForTearDownExecuted($obj)
+    {
+        self::assertSame(1, $obj->count);
+
+        return $obj;
+    }
+
+    /**
+     * Check the Deactivatable was unregistered after executing, so it is not executed again.
+     *
+     * @test
+     *
+     * @depends testRegisterForTearDownExecuted
+     */
+    #[\PHPUnit\Framework\Attributes\Depends('testRegisterForTearDownExecuted')]
+    public function testRegisterForTearDownRemoved($obj)
+    {
+        self::assertSame(1, $obj->count);
+    }
 }
