我希望在多次调用时为同一方法获取不同的返回值。我尝试过很多东西,但没有得到确切答案。
$mock = $this->getMockBuilder('Test')
->disableOriginalConstructor()
->setMethods(array('testMethod'))
->getMock();
$mock->expects($this->once())->method('testMethod')->will($this->returnValue(true));
$mock->expects($this->second())->method('testMethod')->will($this->returnValue(false));
答案 0 :(得分:5)
您可以使用willReturnOnConsecutiveCalls
方法
$mock
->expects($this->exactly(2))
->method('testMethod')
->willReturnOnConsecutiveCalls(true, false);
替代方案(对于phpunit< 4):
$mock
->expects($this->exactly(2))
->method('testMethod')
->will($this->onConsecutiveCalls(true, false));
答案 1 :(得分:1)
我找到了this链接,这有助于我使用at($index)
方法完成此操作。它返回一个匹配器,该匹配器在给定的$index
处调用它所评估的方法时匹配。
$index
匹配器的at()
参数在给定模拟对象的所有方法调用中引用从零开始的索引。使用此匹配器时要小心,因为它可能导致脆弱的测试,这些测试与特定的实现细节过于紧密相关。 More Details
$mock = $this->getMockBuilder('Test')
->disableOriginalConstructor()
->setMethods(array('testMethod'))
->getMock();
$mock->expects($this->at(0))->method('testMethod')->will($this->returnValue(true));
$mock->expects($this->at(1))->method('testMethod')->will($this->returnValue(false));