web-dev-qa-db-ja.com

phpunitモック-メソッドが存在しません

最近、CakePhp 3.xベースのアプリのIntegrationTestCaseでPHPunitを5.3から5.5に更新しました。また、モック生成スクリプトを更新する方法がわかりません。

もともと私はこのようにモックを作成しました:

$stub = $this->getMock('SomeClass', array('execute'));
$stub->method('execute')
     ->will($this->returnValue($this->returnUrl));

PHPUnit 5.5に変更すると、次の警告が表示されます。

PHPUnit_Framework_TestCase::getMock() is deprecated,
use PHPUnit_Framework_TestCase::createMock()
or PHPUnit_Framework_TestCase::getMockBuilder() instead

この警告を修正するために、モック生成を次のように変更しました。

$stub = $this->getMockBuilder('SomeClass', array('execute'))->getMock();
$stub->method('execute')
     ->will($this->returnValue($this->returnUrl));```

テストを実行すると、次のエラーメッセージが表示されます。

exception 'PHPUnit_Framework_MockObject_RuntimeException' 
with message 'Trying to configure method "execute" which cannot be
configured because it does not exist, has not been specified, 
is final, or is static'

誰もが知っている、このエラーを回避する方法は?ありがとうございました。

8
David Albrecht

PHPUnit_Framework_TestCase::getMockBuilder()は、クラス名という1つの引数のみを受け取ります。モックするメソッドは、返されたモックビルダーオブジェクトのsetMethods()メソッドを介して定義する必要があります。

$stub = $this
    ->getMockBuilder('SomeClass')
    ->setMethods(['execute'])
    ->getMock();

こちらもご覧ください

18
ndm

私が再びこの問題に到達したとき、私はこれを自分への答えとして残します:

モックされたメソッドはプライベートではない場合があります。

5
scones

上位メッセージへの追加:スプリットモックメソッド宣言

これの代わりに:

$mock
    ->method('persist')
       ->with($this->isInstanceOf(Bucket::class))
       ->willReturnSelf()
    ->method('save')
       ->willReturnSelf()
;

これを使って:

$mock
    ->method('persist')
        ->willReturnSelf()
;

$mock
   ->method('save')
       ->willReturnSelf()
;
1
Mehmet Gökalp

まず第一に、それは

$stub = $this->getMockBuilder('SomeClass')->getMock();

次に、エラーは、メソッドexecuteがクラスSomeClassに存在することを示しています。

それで、それが本当に存在し、publicではなくfinalであるかどうかを確認してください。

すべてが適切な場合は、完全なクラス名を確認します。実際のものであり、正しい名前空間で指定されている場合。

クラス名での愚かなエラーを回避するには、次の構文を使用することをお勧めします。

$stub = $this->getMockBuilder(SomeClass::class)->getMock();

この場合、SomeClassが存在しないか、名前空間が欠落していると、それに関する明確なエラーが発生します。

0

おそらく、そのメソッドはモックしたクラスに存在しません。