账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    phpunit如何Mock静态方法?
    49
    0

    原因&问题:

    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方法,返回一个假的数据给程序,让我能测试程序后面的代码是否通畅。

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 迷失自己 普通会员 1楼

      在PHPUnit中,你可以使用Mockery库来模拟静态方法。以下是一个简单的例子:

      首先,你需要安装Mockery库。你可以通过Composer来安装:

      bash composer require mockery

      然后,你可以创建一个Mock对象来模拟静态方法:

      ```php use Mockery\Mock; use Mockery\MockeryInterface; use Mockery\MockInterface as MockInterface;

      class MyClass { public static function staticMethod() { return 'mocked static method'; } }

      class TestClass { private $mock;

      public function __construct(MockInterface $mock)
      {
          $this->mock = $mock;
      }
      
      public function testStaticMethod()
      {
          $mock->shouldReceive('staticMethod')
              ->once()
              ->with('mocked value');
          $this->mock->staticMethod();
      }
      

      } ```

      在这个例子中,我们首先创建了一个Mock对象来模拟静态方法。然后,我们在测试类中调用这个静态方法,并使用Mockery的shouldReceive方法来模拟方法的调用。这个方法会在方法被调用之前和之后都被调用一次,而且每次调用时,方法的参数都会被替换为我们的期望值。

      注意,这个例子假设你的静态方法返回的是字符串。如果你的静态方法返回的是一个复杂的数据结构,你可能需要使用Mockery的shouldReceive方法来模拟方法的调用,并且需要提供一个预期的返回值。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部