背景
PHPUnitを実行していたところテストが失敗する箇所で Serialization of 'Closure' is not allowed
が発生するテストがあることがわかりました。
エラーが発生するコード
テストコードを単純にして検証を繰り返したところ、以下のコードで再現しました。
<?php
use Mockery;
use \PHPUnit\Framework\TestCase;
class HogeTest extends \PHPUnit\Framework\TestCase {
protected function setUp(): void
{
$mockService = Mockery::mock('fuga');
parent::setUp();
}
protected function tearDown(): void
{
Mockery::close();
}
public function testHoge() {
$this->assertEquals(1, 2);
}
}
?>
対応
parent::tearDown();
が呼び忘れていたので追加することで対応できました。
<?php
use Mockery;
use \PHPUnit\Framework\TestCase;
class HogeTest extends \PHPUnit\Framework\TestCase {
protected function setUp(): void
{
$mockService = Mockery::mock('fuga');
parent::setUp();
}
protected function tearDown(): void
{
Mockery::close();
parent::tearDown();
}
public function testHoge() {
$this->assertEquals(1, 2);
}
}
?>
余談
-
parent::tearDown();
を呼ばなくてもテストに成功する場合はエラーになりません -
PHPUnitとの統合:Mockery1.0 のサンプルコードも
parent::tearDown();
を呼び出していないので注意が必要です