猫でもわかるWebプログラミングと副業

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

Mockeryでモックしようとしたときに Mockery_XXX::__call($method, $args) should be compatible with ... と言われる 2

f:id:yoshiki_utakata:20181004212834j:plain

前回のあらすじ

以下の記事の続きです。

www.utakata.work

FluentPDO *1 というライブラリのSelectQueryメソッドをMockeryでMockしようとすると、Declaration of Mockery_3_SelectQuery::__call($method, $args) should be compatible with CommonQuery::__call($name, $parameters = Array) と怒られてしまいます。

原因は CommonQueryに定義されている public function __call($name, $parameters = []) このメソッド。これをMockeryが __call($method, $args) というメソッドでオーバーライドしようとするのですが、第二引数のデフォルト値の記述が異なるので、PHPに怒られるわけです。

結論

FluentPDOの内部仕様を意識したくないので、無名クラスのモックにしてしまおう!!

そもそも

$selectQuery = \Mockery::mock(\SelectQuery::class); こんなことをしていましたが、べつにSelectQueryを継承してモックを作る必要がないのです。\Mockery::mock(); こうしてしまいましょう。別にクラスが違ってもshouldReceiveなどのアサーションはちゃんと動きます。

わざわざライブラリの内部実装に頭を悩ませることはないのでこれでいきましょう。