99use PHPUnit \Event \Facade ;
1010use PHPUnit \Framework \MockObject \MockObject ;
1111use ReflectionClass ;
12+ use ReflectionMethod ;
1213use ReflectionProperty ;
1314use SebastianBergmann \Template \Template ;
1415
@@ -117,8 +118,32 @@ public function registerForTearDown(Deactivatable $deactivatable)
117118 $ property ->setAccessible (true );
118119 $ property ->setValue ($ facade , false );
119120
121+ $ method = new ReflectionMethod ($ facade , 'deferredDispatcher ' );
122+ $ method ->setAccessible (true );
123+ $ dispatcher = $ method ->invoke ($ facade );
124+
125+ $ propDispatcher = new ReflectionProperty ($ dispatcher , 'dispatcher ' );
126+ $ propDispatcher ->setAccessible (true );
127+ $ directDispatcher = $ propDispatcher ->getValue ($ dispatcher );
128+
129+ $ propSubscribers = new ReflectionProperty ($ directDispatcher , 'subscribers ' );
130+ $ propSubscribers ->setAccessible (true );
131+
120132 $ facade ->registerSubscriber (
121- new MockDisabler ($ deactivatable )
133+ new MockDisabler (
134+ $ deactivatable ,
135+ static function (MockDisabler $ original ) use ($ directDispatcher , $ propSubscribers ) {
136+ $ subscribers = $ propSubscribers ->getValue ($ directDispatcher );
137+
138+ foreach ($ subscribers ['PHPUnit\Event\Test\Finished ' ] as $ key => $ subscriber ) {
139+ if ($ original === $ subscriber ) {
140+ unset($ subscribers ['PHPUnit\Event\Test\Finished ' ][$ key ]);
141+ }
142+ }
143+
144+ $ propSubscribers ->setValue ($ directDispatcher , $ subscribers );
145+ }
146+ )
122147 );
123148
124149 $ property ->setValue ($ facade , true );
@@ -127,7 +152,9 @@ public function registerForTearDown(Deactivatable $deactivatable)
127152 }
128153
129154 $ result = $ this ->getTestResultObject ();
130- $ result ->addListener (new MockDisabler ($ deactivatable ));
155+ $ result ->addListener (new MockDisabler ($ deactivatable , static function (MockDisabler $ listener ) use ($ result ) {
156+ $ result ->removeListener ($ listener );
157+ }));
131158 }
132159
133160 /**
0 commit comments