最近、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'
誰もが知っている、このエラーを回避する方法は?ありがとうございました。
PHPUnit_Framework_TestCase::getMockBuilder()
は、クラス名という1つの引数のみを受け取ります。モックするメソッドは、返されたモックビルダーオブジェクトのsetMethods()
メソッドを介して定義する必要があります。
$stub = $this
->getMockBuilder('SomeClass')
->setMethods(['execute'])
->getMock();
こちらもご覧ください
私が再びこの問題に到達したとき、私はこれを自分への答えとして残します:
モックされたメソッドはプライベートではない場合があります。
上位メッセージへの追加:スプリットモックメソッド宣言
これの代わりに:
$mock
->method('persist')
->with($this->isInstanceOf(Bucket::class))
->willReturnSelf()
->method('save')
->willReturnSelf()
;
これを使って:
$mock
->method('persist')
->willReturnSelf()
;
$mock
->method('save')
->willReturnSelf()
;
まず第一に、それは
$stub = $this->getMockBuilder('SomeClass')->getMock();
次に、エラーは、メソッドexecute
がクラスSomeClass
に存在することを示しています。
それで、それが本当に存在し、public
ではなくfinal
であるかどうかを確認してください。
すべてが適切な場合は、完全なクラス名を確認します。実際のものであり、正しい名前空間で指定されている場合。
クラス名での愚かなエラーを回避するには、次の構文を使用することをお勧めします。
$stub = $this->getMockBuilder(SomeClass::class)->getMock();
この場合、SomeClassが存在しないか、名前空間が欠落していると、それに関する明確なエラーが発生します。
おそらく、そのメソッドはモックしたクラスに存在しません。