createStub(TransactionManagerInterface::class); $tx->method('execute')->willReturnCallback(static fn (\Closure $work): mixed => $work($work)); return $tx; } public function testExecuteLöschtUndDispatchtEvent(): void { $jetzt = $this->jetzt(); $mahlzeit = new Mahlzeit(7, 'Bolognese', '', [], 1, MahlzeitStatus::Geplant, $jetzt, $jetzt, null); $manager = $this->createMock(MahlzeitManagerInterface::class); $manager->expects(self::once())->method('find')->with(7)->willReturn($mahlzeit); $manager->expects(self::once())->method('delete')->with(7); $events = $this->createMock(EventDispatcherInterface::class); $events->expects(self::once()) ->method('dispatch') ->with(self::equalTo(new MahlzeitDeletedEvent(id: 7, name: 'Bolognese'))); $useCase = new MahlzeitDeleteUseCase($this->tx(), $manager, $events); $useCase->execute(7); } public function testExecuteDispatchtKeinEventBeiFehler(): void { $manager = $this->createStub(MahlzeitManagerInterface::class); $manager->method('find')->willThrowException(new MahlzeitNotFoundException(99)); $events = $this->createMock(EventDispatcherInterface::class); $events->expects(self::never())->method('dispatch'); $useCase = new MahlzeitDeleteUseCase($this->tx(), $manager, $events); $this->expectException(MahlzeitNotFoundException::class); try { $useCase->execute(99); } finally { // Erwartete Exception oben. } } }