Php 如何修复mockry mock对象抛出BadMethodCallException?
在silex应用程序中,我有一个Php 如何修复mockry mock对象抛出BadMethodCallException?,php,unit-testing,phpunit,mockery,Php,Unit Testing,Phpunit,Mockery,在silex应用程序中,我有一个KafkaAPiClient类,它肯定有公共方法postMessages <?php namespace Kopernikus\KafkaWriter; use Kopernikus\KafkaWriter\Model\AbstractMessage; /** * KafkaApiClient. **/ class KafkaApiClient { /** * @param AbstractMessage[] $msg
KafkaAPiClient
类,它肯定有公共方法postMessages
<?php
namespace Kopernikus\KafkaWriter;
use Kopernikus\KafkaWriter\Model\AbstractMessage;
/**
* KafkaApiClient.
**/
class KafkaApiClient
{
/**
* @param AbstractMessage[] $msg
*/
public function postMessages(array $messages)
{
foreach ($messages as $message) {
$this->postMessage($message);
}
}
public function postMessage(AbstractMessage $msg)
{
...
}
}
我得到:
1) unit\Request\MockeryMethodsNotBeingCallableTest::testMockMethodIsCallable
BadMethodCallException: Method Mockery_11_Kopernikus_KafkaWriter_KafkaApiClient::postMessages() does not exist on this mock object
~/le-project/tests/unit/Request/MockeryMethodsNotBeingCallableTest.php:14
我很困惑,我希望mock不做任何事情,但允许调用这些方法,以便以后可以添加我的期望
虽然我已经找到了一个解决方案,但我仍然想知道是否可以在默认情况下模拟所有方法,然后检查是否调用了某些方法。在模拟对象上存在
应该忽略方法。调用,即:忽略对尚未定义的方法的调用,导致模拟不执行任何操作:
$leMock = \Mockery::mock(KafkaApiClient::class);
$leMock->shouldIgnoreMissing()
$leMock->postMessages([]);
没有,就没有意义。当我以这种方式实例化mock时,我的队列遇到了另一个错误,因为默认情况下方法将返回null
,并且必须显式地声明它们的返回值
$msg = new Message('dummy-message');
$this->kafkaQueue
->shouldIgnoreMissing()
->shouldReceive('getMessages')->andReturn([$msg]);
对getMessages
的任何调用现在都将准确返回数组[$msg]
或者,可以通过添加shouldReceive
,非常明确地说明用mockry调用哪些方法:
public function testMockMethodIsCallable()
{
$leMock = \Mockery::mock(KafkaApiClient::class);
$leMock->shouldReceive('postMessages');
$leMock->postMessages([]);
}
它说它没有postMessages()函数?我想你应该检查一下房间KafkaApiClient@MuratCemYALIN不,具体类有这个方法。我绝对确信,这不是模仿。也许它是受保护的还是私人的?@MuratCemYALIN它是公共的,这不是问题所在。具体类不是问题所在。
public function testMockMethodIsCallable()
{
$leMock = \Mockery::mock(KafkaApiClient::class);
$leMock->shouldReceive('postMessages');
$leMock->postMessages([]);
}