前回のあらすじ
以下の記事の続きです。
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などのアサーションはちゃんと動きます。
わざわざライブラリの内部実装に頭を悩ませることはないのでこれでいきましょう。