PHPUnit Mock Измените ожидания позже

У меня простой пример использования. Я хочу иметь метод setUp, который заставит мой mock-объект вернуть значение по умолчанию:

$this->myservice ->expects($this->any()) ->method('checkUniqueness') ->will($this->returnValue(true)); 

Но затем в некоторых тестах я хочу вернуть другое значение:

 $this->myservice ->expects($this->exactly(1)) ->method('checkUniqueness') ->will($this->returnValue(false)); 

Я использовал GoogleMock для C ++ в прошлом, и у него было «returnByDefault» или что-то в этом роде. Я не мог понять, возможно ли это в PHPUnit (нет документации api, и код трудно прочитать, чтобы найти то, что я хочу).

Теперь я не могу просто изменить $this->myservice на новый макет, потому что в настройке я $this->myservice его другим вещам, которые нужно издеваться или тестировать.

Мое единственное другое решение заключается в том, что я теряю пользу установки и вместо этого собираю все свои макеты для каждого теста.

Вы можете переместить код setUp() в другой метод, который имеет параметры. Затем этот метод setUp() из setUp() , и вы можете вызвать его также из своего тестового метода, но с параметрами, отличными от стандартных.

Продолжайте строить макет в setUp() но задайте ожидание отдельно в каждом тесте:

 class FooTest extends PHPUnit_Framework_TestCase { private $myservice; private $foo; public function setUp(){ $this->myService = $this->getMockBuilder('myservice')->getMock(); $this->foo = new Foo($this->myService); } public function testUniqueThing(){ $this->myservice ->expects($this->any()) ->method('checkUniqueness') ->will($this->returnValue(true)); $this->assertEqual('baz', $this->foo->calculateTheThing()); } public function testNonUniqueThing(){ $this->myservice ->expects($this->any()) ->method('checkUniqueness') ->will($this->returnValue(false)); $this->assertEqual('bar', $this->foo->calculateTheThing()); } } 

Эти два ожидания не будут мешать друг другу, потому что PHPUnit создает экземпляр FooTest для запуска каждого теста.