php:use "Mockery" to mock a static method called in another static method

Xiang Li picture Xiang Li · Mar 10, 2016 · Viewed 8.5k times · Source

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?

Answer

Jakub Zalas picture Jakub Zalas · Mar 10, 2016

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:

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.