鍍金池/ 問(wèn)答/PHP/ phpunit如何Mock靜態(tài)方法?

phpunit如何Mock靜態(tài)方法?

原因&問(wèn)題:

1、項(xiàng)目封裝了很多工具類(lèi),比如發(fā)送短信驗(yàn)證碼發(fā)送郵件、調(diào)用某些第三方API,都是一些static方法
2、現(xiàn)在想對(duì)某個(gè)方法做單元測(cè)試,這個(gè)方法里面調(diào)用了工具類(lèi)的static方法
3、項(xiàng)目代碼是不能改的
4、如何MOCK一個(gè)假的靜態(tài)方法,讓程序該調(diào)用靜態(tài)方法的時(shí)候,會(huì)自動(dòng)去調(diào)用假的方法?

畢竟某些方法,做測(cè)試的時(shí)候調(diào)用是不方便,但是下面的邏輯又需要他返回的數(shù)據(jù)。

我注意到PHPUnit的Mock,官方名稱(chēng)是Mock Object。

How to do...

翻閱手冊(cè),并沒(méi)有發(fā)現(xiàn)關(guān)于如何模仿靜態(tài)方法的例子

代碼示例:

class Utility
{
    public static function sendEmail ($email)
    {
        // 發(fā)送郵件代碼
    }

    public static function sendCode ($mobile)
    {
        // 發(fā)送手機(jī)短信驗(yàn)證碼代碼
    }
}

class SendSMS 
{
    public function send ()
    {
        $mobile = '123456789';
        $code = Utility::sendCode($mobile);

        // 然后把code存入到數(shù)據(jù)庫(kù)
    }
}

單元測(cè)試SendSMS類(lèi)下面的send方法的時(shí)候,如何在不修改原程序代碼的情況下,讓程序自動(dòng)跳轉(zhuǎn)到我們模擬假的Utility::sendCode方法,返回一個(gè)假的數(shù)據(jù)給程序,讓我能測(cè)試程序后面的代碼是否通暢。

回答
編輯回答
假灑脫

Mock Object不能模擬靜態(tài)方法,可以考慮用AspectMock

2017年12月23日 04:18
編輯回答
神經(jīng)質(zhì)

可以的,你看下,但是官方還是不推薦“alias”

$mock = Mockery::mock('alias:Utility');
$mock->shouldReceive('send')
     ->once()
     ->withAnyArgs()
     ->andReturn('success!');
$mock::send();     

http://docs.mockery.io/en/lat...

2017年11月30日 17:38