[PHP] Laravel单元测试-如何对final类进行mock

前言:单元测试是一项重要的开发技能

 

关于如何在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/

 

步骤1,安装扩展

composer require dg/bypass-finals --dev

 

步骤2,创建hook类

tests/Hook/BypassFinalHook.php

<?php

namespace Tests\Hook;

use DG\BypassFinals;
use PHPUnit\Runner\BeforeTestHook;

/**
 * Class BypassFinalHook
 * @package Tests\Hook
 *
 * @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="Tests\Bootstrap"/>
    <extension class="Tests\Hook\BypassFinalHook"/> <!-- 加上这句 -->
</extensions>

 

步骤4,示例代码

final类

final class TestCacheConst extends \Pea\Consts\CacheConst
{
    /**
     *
     * @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!

 

posted @ 2020-05-04 10:20  DavidHHuan  阅读(780)  评论(0编辑  收藏  举报