Так точно работает:
$this->anyMock
->expects($this->exactly(4))
->method('doSomething')
->withConsecutive(...$args)
->willReturnOnConsecutiveCalls(...$results)
Кол-во $args и $results и цифра в $this->exactly(4) одинаково,
$args - массив массивов
UPD: Сейчас глянул код, по идее ваш способ абсолютно эквивалентный и должен работать, либо приведенный мной будет ругаться также. переменные $response1 и $response2 точно имплементят ResponseInterface?
Причина проблемы:
Вы просто настраиваете мок на одно число вызовов, а в ассертах вызываете меньшее число раз (в примере -- настроили на 4 ответа, а ассертов всего 3, то есть 1 остался заряженный) и в моке остается значение, которое потом вызывается каким-либо образом в других ситцациях!
Классический сайд эффект. Нужно после использованного мока удостовериться, что он пустой или в новом тесте заново его создать, скорее всего у вас мок в приватной переменной класса и потому состояние шарится между методами теста...
Именно поэтому вам expects() скорее всего и подсказала, в чем дело.
Решения:
- Создавать мок именно в методе, не злобоупотреблять setUp()
- Контроллировать число вызовов в методе и аргументов для Consecutive Calls, в этом поможет
expects($this->exactly(N))