1円でも得したいWebエンジニアの日常

クーポンだったりクレジットカードのポイントだったりを利用して1円でも得しつつ生活を便利にしていきたい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などのアサーションはちゃんと動きます。

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