PHPのモックライブラリであるMockeryを使ってphpunitのコードを作成して実行するとき、class already exists
のエラーが出ることがあります。
Mockery\Exception\RuntimeException: Could not load mock FooClass, class already exists
エラーの理由
このエラーが出る理由は、Mockelyでは同一のクラスに対してalias:やoverload:を使ったモッククラスは複数作成できないのですが、複数のテストで同じクラスのモックを作ると状態を保持してしまうためです。
対応方法
以下のように@runInSeparateProcess
と@preserveGlobalState disabled
のアノテーションをつけることで、phpunitに対して状態の保持をしないように指示すれば良いです。
/**
* @runInSeparateProcess
* @preserveGlobalState disabled
*/
public function case1Test()
{
$fooMock = Mockery::mock('alias:' . FooClass::class);
...
}
/**
* @runInSeparateProcess
* @preserveGlobalState disabled
*/
public function case2Test()
{
$fooMock = Mockery::mock('alias:' . FooClass::class);
...
}
こちらもおススメ