いつもお世話になっております。
Aというクラス内にあるメソッドのユニットテストを書いています。
テスト対象は、以下のmethodB()になります。
class A { /** * テスト対象メソッド内で呼び出される */ public function methodA($message) { return $message; } /** * テスト対象メソッド */ public static function methodB($id, $message) { } $class= self::find($id); $class->methodA($message); } }
staticメソッドであるmethodB()内ではmethodA()が呼び出されます。
そこで、methodAの部分はモックにして、methodA()が呼び出されたことを確認したいと考え、
以下のようなパーシャルモックを作成しました。
/** * @test */ public function methodB() { $classMock = \Mockery::mock(Class::class)->makePartial(); $classMock->shouldReceive('methodA')->once()->with('テスト'); $classMock::methodB(1, 'テスト'); }
これでテストを動かすと、
Mockery\Exception\BadMethodCallException: Static method Mockery_2_App_Models_Message::methodB() does not exist on this mock object
というエラーとなり、テストは落ちてしまいます。
staticメソッドをモックする場合はailiasやoverrideが必要かと思いますが、
makePartial()を使うことで methodA(staticでない) のみがモックされ、methodB(static)には影響がない、と認識しております。
それ自体が間違っているのでしょうか。。?
aliasやoverrideはできるだけ避けたく、通常のmockで実装できないか悩んでおります。
どなたかご助言いただけませんでしょうか。
何卒よろしくお願いいたします。
環境:
PHPUnit 9.5.18
Mockery 1.4
あなたの回答
tips
プレビュー