Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use Mockery to mock a static method called in another static method

I want to mock a static method which has been used in another method using Mokcery,Just as follows:

Class SomeClass
{
   public static function methodA()
   {
     .....;
     self::B();
   } 
   public static function methodB()
   {
     Do SomeThing
   }
}

if I want to mock methodB,and use methodA,the mock function doesn't work, just because methodB is used in methodA,just as below

 use Mockery as m;
   $mocktest = m::mock->('SomeClass[B]');
   $mocktest->shouldReceive('B')->andReturn("expectedResult");
   $mocktest->methodA();

The code above will result in methodB still return it's original result rather than 'expectedResult'. I expect the methodB used in the methodA to be mocked,how could I operate?

like image 860
Xiang Li Avatar asked Mar 10 '16 08:03

Xiang Li


1 Answers

You need to use an alias to mock a static method:

$mock = \Mockery::mock('alias:SomeClass');

Note that class can't be loaded yet. Otherwise mockery won't be able to alias it.

More in the docs:

  • Mocking Public Static Methods
  • Quick Reference

Just be warned that mocking static methods is not a good idea. If you feel like you need it you have problem with design. Mocking the class you're testing is even worse and indicates your class has too many responsibilities.

like image 161
Jakub Zalas Avatar answered Sep 18 '22 12:09

Jakub Zalas