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

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

原因&問題:

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

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

我注意到PHPUnit的Mock,官方名稱是Mock Object。

How to do...

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

代碼示例:

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

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

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

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

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

回答
編輯回答
假灑脫

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

2017年12月23日 04:18
編輯回答
神經質

可以的,你看下,但是官方還是不推薦“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