原因&问题:
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方法,返回一个假的数据给程序,让我能测试程序后面的代码是否通畅。
Mock Object不能模拟静态方法,可以考虑用AspectMock