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.
1 |
$mockBuilder = $this->getMockBuilder(\Example\MyClass::class); |
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.
1 2 3 4 5 6 |
public function testSomething() { $mockBuilder = $this->getMockBuilder(\Example\MyClass::class) ->disableOriginalConstructor() ->disableOriginalClone(); } |
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.
1 2 3 4 5 |
public function testSomething() { $mockBuilder = $this->getMockBuilder(\Example\MyClass::class) ->setConstructorArgs(['Parameter 1', 'Parameter 2']); } |
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.
1 2 3 4 5 |
public function testSomething() { $mockBuilder = $this->getMockBuilder(\Example\MyClass::class) ->setMethods(['methodName1', 'methodeName2']); } |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
namespace Test; class GetMockBuilderTest extends \PHPUnit_Framework_TestCase { public function testSomething() { $mock = $this->getMockBuilder(\Example\MyClass::class) ->setConstructorArgs(['Parameter 1', 'Parameter 2']) ->getMock(); $mock->expects($this->once()) ->method('theMethod') ->with('Ein Parameterwert') ->will($this->returnValue('Wir testen hier gerade was.')); // ... } } |