WebエンジニアのLoL日記

LoLをプレイしたりLJLの試合を見たりするのが好きなエンジニア。LoLのイベントやパッチノートなど気になった点を記事にしたり、LJLについの記事をかいたりしています。某社でWeb系のエンジニアとして働いているので、技術系の記事もたまに書きます。コンタクトを取りたい場合はtwitterまで。

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などのアサーションはちゃんと動きます。

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