PHPUnit: how do I mock multiple method calls with multiple arguments? PHPUnit: how do I mock multiple method calls with multiple arguments? php php

PHPUnit: how do I mock multiple method calls with multiple arguments?


In my case the answer turned out to be quite simple:

$this->expects($this->at(0))    ->method('write')    ->with(/* first set of params */);$this->expects($this->at(1))    ->method('write')    ->with(/* second set of params */);

The key is to use $this->at(n), with n being the Nth call of the method. I couldn't do anything with any of the logicalOr() variants I tried.


For others who are looking to both match input parameters and provide return values for multiple calls.. this works for me:

    $mock->method('myMockedMethod')         ->withConsecutive([$argA1, $argA2], [$argB1, $argB2], [$argC1, $argC2])         ->willReturnOnConsecutiveCalls($retValue1, $retValue2, $retValue3);


Stubbing a method call to return the value from a map

$map = array(    array('arg1_1', 'arg2_1', 'arg3_1', 'return_1'),    array('arg1_2', 'arg2_2', 'arg3_2', 'return_2'),    array('arg1_3', 'arg2_3', 'arg3_3', 'return_3'),);$mock->expects($this->exactly(3))    ->method('MyMockedMethod')    ->will($this->returnValueMap($map));

Or you can use

$mock->expects($this->exactly(3))    ->method('MyMockedMethod')    ->will($this->onConsecutiveCalls('return_1', 'return_2', 'return_3'));

if you don't need to specify input arguments