PHPUnit – Einfacher Mocks erstellen mit getMockBuilder()

Zugegebenermaßen ist die Erstellung von Mocks mit getMock() (hier ein Artikel dazu) durch die vielen Parameter dieser Funktion nicht ganz trivial. Deshalb gibt es praktischerweise einen Builder (?) der dies übernimmt. Welche Methoden dieser besitzt und wie dadurch euer Leben beim Unit-Testing vereinfacht wird erfahrt ihr hier.


Den Builder laden

Für den Builder bietet uns PHPUnit einen Getter: getMockBuilder(). Er benötigt die Klasse für die wir ein Mock erzeugen wollen als einzigen Parameter.


Methoden zur Definition des Mock-Objekts

Mussten wir uns bei getMock() noch jede Menge Parameter merken inklusive ihrer Standardwerte (wenn wir nur einen Parameter weiter hinten wollten), bietet uns der Mock-Builder alle Optionen mit eigenständige Methoden als Fluent Interface.

Optionen für den Konstruktor

Standardmäßig wird der Konstruktor ausgeführt. Es gibt also nur eine Funktion um ihn zu deaktivieren. Normalerweise wollen wir in diesem Fall auch gleich klonen mit unterdrücken.

Lassen wir den Konstruktor aufrufen, müssen wir die Argumente für ihn mit setConstructorArgs(array $args) angeben. Die Methode wird mit einem Array gefüttert, dass die Parameter in der entsprechenden Reihenfolge enthält.

Benötigt der Konstruktor keine Parameter, kann dieser Schritt natürlich weggelassen werden.

Klassennamen ändern

Sollten wir tatsächlich mal in die Verlegenheit kommen, den Klassennamen ändern zu wollen (der nervige vierte Parameter von getMock()), dann können wir das mit setMockClassName('TestKlasse') erledigen.

Autoloading unterdrücken

Möchten wir den Autoloader unterdrücken geschieht dies mit disableAutoload().

Methoden definieren, die simuliert werden sollen

Sollen nur einige Methoden der Klasse simuliert werden und die übrigen an das Original weitergeleitet werden, dann können wir diese mit setMethods(array $methods) festlegen.


Mock erhalten

Zu guter Letzt müssen wir uns noch mit getMock() das tatsächliche Mock-Objekt vom Builder geben lassen. Insgesamt sieht die Vorgehensweise also beispielsweise wie folgt aus.