[PHP] Laravel单元测试-如何对final类进行mock 步骤1,安装扩展 步骤2,创建hook类 步骤3,配置phpunit.xml
前言:单元测试是一项重要的开发技能
关于如何在laravel做单元测试就不多介绍了,写这文章的时候,使用的是Laravel6.x,关于它的单元测试可参考:https://learnku.com/docs/laravel/6.x/testing/5182
PHPUnit与Mockery是不支持final类的mock测试的,在网上翻了很久,终于找到一篇靠谱的,而且是成功的案例,原地址:https://www.tomasvotruba.com/blog/2019/03/28/how-to-mock-final-classes-in-phpunit/
composer require dg/bypass-finals --dev
步骤2,创建hook类
tests/Hook/BypassFinalHook.php
<?php namespace TestsHook; use DGBypassFinals; use PHPUnitRunnerBeforeTestHook; /** * Class BypassFinalHook * @package TestsHook * * @author birdylee <birdylee_cn@163.com> * @since 2020-05-04 */ class BypassFinalHook implements BeforeTestHook { /** * @inheritDoc */ public function executeBeforeTest(string $test): void { BypassFinals::enable(); } }
步骤3,配置phpunit.xml
这个文件,在laravel根目录已经存在了,在对应的位置加上
<extensions> <extension class="TestsBootstrap"/> <extension class="TestsHookBypassFinalHook"/> <!-- 加上这句 --> </extensions>
步骤4,示例代码
final类
final class TestCacheConst extends PeaConstsCacheConst { /** * * @author birdylee <birdylee_cn@163.com> * @since 2020-05-03 */ public function unittest() { return 'original'; } }
test类
class FinalClassTest extends TestCase { /** * * @author birdylee <birdylee_cn@163.com> * @since 2020-05-03 */ public function testCommonMethod() { $this->mock('overload:' . TestCacheConst::class, function (MockInterface $mock) { $mock->shouldReceive('unittest')->andReturn('mock unittest'); }); $cacheConst = new TestCacheConst(); echo $cacheConst->unittest(); } }
就是那么简单!
Hava fun with PHP!