Ursprünglich habe ich diesen Artikel am 5. Dezember 2025 als Newsletter an meine Abonnentinnen und Abonnenten verschickt. Seitdem habe ich ihn überarbeitet, um Änderungen nach der Veröffentlichung von PHPUnit 12.5 zu berücksichtigen. Weitere Informationen zu meinem Newsletter findest du am Ende dieses Artikels.
Mock Objects ohne Erwartungen
PHPUnit gibt jetzt eine Notice aus, wenn eine Testmethode zum Beispiel mit createMock() ein Mock Object erstellt, aber keine Erwartung dafür konfiguriert. Diese tolle Diagnosefunktion deckt ein häufiges Versehen im Testcode auf.
Diese Änderung betrifft ein wichtiges Prinzip beim Testen von Software: den Unterschied zwischen Test Stubs und Mock Objects. Letztere sind speziell dafür gedacht, die Kommunikation zwischen zusammenarbeitenden Objekten zu überprüfen. Wenn du ein Mock Object erzeugst, aber die Kommunikation nie anhand von Erwartungen überprüfst, benutzt du wahrscheinlich den falschen Typ von Test Double.
Wichtig: In der Standardkonfiguration zeigt PHPUnit die Details dieser Notice nicht an. Darüber hinaus führt die Verwendung eines Mock Objects ohne konfigurierte Erwartungen nicht dazu, dass PHPUnit mit einem Exit Code endet, der das Fehlschlagen der Testsuite signalisiert. Beide Verhaltensweisen können jedoch gezielt aktiviert werden: entweder durch das Setzen von displayDetailsOnPhpunitNotices="true" und failOnPhpunitNotice="true" in der XML-Konfiguration oder die Verwendung der CLI-Optionen --display-phpunit-notices und --fail-on-phpunit-notice.
Wie in meinem Artikel "Testen mit (und ohne) Abhängigkeiten" beschrieben, hat die Entwicklung von PHPUnit hin zu mehr Klarheit zu dieser klaren Anleitung geführt. Anstatt ungenutzte Mock Objects einfach zu akzeptieren, fordert PHPUnit dich jetzt auf, entweder das erwartete Verhalten zu überprüfen oder die Verwendung von createStub() anstelle von createMock() zu überdenken. Dieser Anstoß zu besseren Testpraktiken hilft dabei, sicherzustellen, dass deine Testsuite fokussiert und zielgerichtet bleibt.
Warum ist das wichtig? Beim Testen geht es um bewusste Kommunikation. Mock Objects sind wie Theatermasken Werkzeuge für bewusste Ausdrucksformen. Wenn du ein Mock Object erzeugst, aber keine Erwartungen konfigurierst, erstellst du eine Maske ohne Zweck: eine Performance ohne Absicht. Die neue Notice von PHPUnit 12.5 fordert dich auf, zu überdenken, ob diese Maske tatsächlich eine Rolle im Narrativ deines Tests spielt.
Angesichts der Tatsache, dass Testsuites in der Praxis oft auf einer gemeinsamen Initialisierungslogik basieren, hat PHPUnit 12.5 ein Attribut eingeführt, um Entwicklerinnen und Entwicklern, die Mock Objects in einer Before-Test-Methode erstellen, dabei zu helfen, Code-Duplikate über mehrere Tests hinweg zu reduzieren. In solchen Fällen kann ein einzelnes Test Double in einer Testmethode als Mock Object mit Erwartungen fungieren, in einer anderen jedoch lediglich als Test Stub. Da ein Mock Object nicht in einen Test Stub geändert werden kann, bietet das Attribut #[AllowMockObjectsWithoutExpectations] eine praktische Möglichkeit, die Notice in bestimmten Kontexten und auf Testgranularität zu deaktivieren. Es stellt sicher, dass die Strenge von PHPUnit ein besseres Design fördert, ohne gültige, etablierte Testmuster wie gemeinsame Test Fixtures oder abstrakte Basisklassen für Testfallklassen zu behindern.
Es gibt Edge Cases, in denen PHPUnit die oben beschriebene Notice ausgibt, obwohl wir sie nicht erwarten würden. Wenn wir wissen, wie PHPUnit intern mit Mock Objects umgeht, verwirrt uns die Notice in diesen Situationen nicht: Jedes während eines Tests erzeugte Mock Object wird am Ende des Tests verifiziert, unabhängig davon, ob der Testcode noch eine Referenz darauf hält. Hier habe ich das genauer ausgeführt.
Mehr Flexibilität: --all CLI-Option
Die --all CLI-Option kann jetzt verwendet werden, um die in deiner XML-Konfigurationsdatei konfigurierte Testauswahl zu überschreiben. Dies ist besonders nützlich, wenn du CLI-Optionen wie --list-suites, --list-groups oder --list-tests verwendest.
Dadurch kannst du die Testausführung über die Befehlszeile flexibler steuern, egal was in deiner Konfigurationsdatei steht.
Vorbereitung auf die Zukunft: PHPUnit 13
PHPUnit 12.5 war die letzte Feature-Version der PHPUnit 12-Serie. PHPUnit 13 kommt im Februar 2026 raus.
Wenn du die Deprecations noch nicht durchgesehen hast, solltest du das jetzt tun. Die Datei DEPRECATIONS.md auf GitHub listet alle abgekündigten Features, die du in deiner Testsuite berücksichtigen solltest, um einen reibungslosen Übergang zu PHPUnit 13 zu gewährleisten.
Wenn du dich jetzt mit diesen Deprecations beschäftigst, hast du einen Vorsprung und vermeidest Überraschungen, wenn PHPUnit 13 veröffentlicht wird.
Livestream
Hier ist die Aufzeichnung des Livestreams, in dem ich die wichtigsten Änderungen in PHPUnit 12.5 erläutert habe:
Exklusive Einblicke direkt in deinem Posteingang
Zeitgleich mit jedem Feature-Release von PHPUnit alle zwei Monate liefere ich eine umfassende Analyse der neuen Funktionen, Implementierungsdetails und strategischen Überlegungen hinter jeder Verbesserung direkt an meine Abonnentinnen und Abonnenten. Es ist mehr als nur ein ChangeLog: Es ist dein Tor zum Verständnis, wie modernste Testfunktionen deinen Entwicklungs-Workflow verändern können.
Einen Monat, nachdem meine Abonnentinnen und Abonnenten den Newsletter erhalten haben, veröffentliche ich den Inhalt hier auf dieser Website. Melde dich jetzt an, um sicherzustellen, dass du wertvolle Informationen über PHPUnit so schnell wie möglich erhältst.