如何在Mockito中正确模拟接口?

时间:2019-05-22 13:29:54

标签: php unit-testing mockery

对于单元测试,我通过以下方式创建一个模拟对象:

$passenger = M::mock(PassengerInterface::class);

我将此模拟传递到要进行单元测试的服务中。该服务正在尝试访问一个未定义的方法,因此通过以下方式导致了预期的失败:

[BadMethodCallException] Method Mockery_3_Dreamlines_BookingService_Bundle_Bundle_Entity_PassengerInterface::isInfant() does not exist on this mock object  

因此,我通过

在模拟对象上定义了方法
$passenger = M::mock(PassengerInterface::class)->shouldReceive('isInfant')->andReturn(false);

然而,这通过以下方式意外地使测试失败了:

[PHPUnit_Framework_Exception] Argument 2 passed to Dreamlines\BookingService\Bundle\Bundle\Operator\ResponseModifier\InfantPriceModifier::adjustPrice()
must implement interface Dreamlines\BookingService\OperatorBundle\Entity\PassengerInterface,
Mockery\CompositeExpectation given 

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

您使用的流利语法不正确。

Mockery的andReturn不会返回模拟对象,而是期望值。您应该创建一个实例,对其进行变异,然后使用修改后的实例:

$passenger = M::mock(PassengerInterface::class); // creates the mock
$passenger->shouldReceive("isInfant")->andReturn(false); // this returns an expectation, let's ignore that return value
// now you can use $passenger as expected