Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何修复mockry mock对象抛出BadMethodCallException?_Php_Unit Testing_Phpunit_Mockery - Fatal编程技术网

Php 如何修复mockry mock对象抛出BadMethodCallException?

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

在silex应用程序中,我有一个
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([]);
}