phpunit如何Mock静态方法?

原因&问题:

1、项目封装了很多工具类,比如发送短信验证码发送邮件、调用某些第三方API,都是一些static方法
2、现在想对某个方法做单元测试,这个方法里面调用了工具类的static方法
3、项目代码是不能改的
4、如何MOCK一个假的静态方法,让程序该调用静态方法的时候,会自动去调用假的方法?

毕竟某些方法,做测试的时候调用是不方便,但是下面的逻辑又需要他返回的数据。

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

How to do...

翻阅手册,并没有发现关于如何模仿静态方法的例子

代码示例:

class Utility
{
    public static function sendEmail ($email)
    {
        // 发送邮件代码
    }

    public static function sendCode ($mobile)
    {
        // 发送手机短信验证码代码
    }
}

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

        // 然后把code存入到数据库
    }
}

单元测试SendSMS类下面的send方法的时候,如何在不修改原程序代码的情况下,让程序自动跳转到我们模拟假的Utility::sendCode方法,返回一个假的数据给程序,让我能测试程序后面的代码是否通畅。

阅读 7.7k
2 个回答

Mock Object不能模拟静态方法,可以考虑用AspectMock

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题