PhpStorm plugin to provide smart autocomplete, code navigation and refactoring features for mocked class methods. Supported all versions of PhpStorm since 2017.1
| Key | Value |
|---|---|
| Plugin Url | https://plugins.jetbrains.com/plugin/9674 |
| ID | de.espend.idea.php.phpunit |
| Changelog | CHANGELOG |
| Build and Deployment | MAINTENANCE |
| Origin Fork | maxfilatov/phpuaca |
Stable version, JetBrains repository:
- Go to
PhpStorm -> Preferences... -> Plugins -> Browse repositories ...and search for PHPUnit Enhancement plugin - Restart PhpStorm
- Method autocompletion for class, abstract class and trait mock objects;
- Type providers:
getMock,getMockForAbstractClass, etc. will return mock object with methods of mocking class andPHPUnit_Framework_MockObject_MockObject; - Supported PHPUnit methods:
PHPUnit_Framework_MockObject_MockBuilder::setMethodsPHPUnit_Framework_TestCase::getMockPHPUnit_Framework_TestCase::getMockClassPHPUnit_Framework_TestCase::getMockForAbstractClassPHPUnit_Framework_TestCase::getMockForTraitPHPUnit_Framework_MockObject_Builder_InvocationMocker::method
- Type providers:
- Code navigation (go to declaration, find usages, etc.) and refactoring (rename methods);
- Highlighting of incorrect method usages;
- Prophecy support.
- Mockery support.
/** @var $x \PHPUnit\Framework\TestCase */ $x->createMock(Foo::class)->bar();/** @var $x \PHPUnit\Framework\TestCase */ $x->prophesize(Foo::class)->bar();class Foo extends \PHPUnit\Framework\TestCase { public function foobar() { $foo = $this->createMock(Foo::class); $foo->method('<caret>') } }class Foo extends \PHPUnit\Framework\TestCase { public function testFoo() { $bar = $this->createPartialMock(\\Foo\Bar::class, ['<caret>']); } }class Foo extends \PHPUnit\Framework\TestCase { public function setUp() { $this->foo = $this->createMock('Foo\Bar'); } public function foobar() { $this->foo->method('<caret>'); } }class FooTest extends \PHPUnit\Framework\TestCase { public function setUp() { $this->foo = $this->prophesize(Foo::class); } public function testFoobar() { $this->foo->getBar()->willReturn(); } }class FooTest extends \PHPUnit\Framework\TestCase { public function setUp() { $this->foo = $this->getMockBuilder(\Foo::class); } public function testFoobar() { $this->foo->getMock()->bar(); } }class FooTest extends \PHPUnit\Framework\TestCase { public function testFoobar() { $foo = $this->prophesize(Foo::class); $foo->getBar()->willReturn(); } }class FooTest extends \PHPUnit\Framework\TestCase { public function setUp() { $this->foo = $this->prophesize(Foo::class); } public function testFoobar() { $this->foo->getBar()->willReturn(); } }class FooTest extends \PHPUnit\Framework\TestCase { public function testFoobar() { $foo = $this->prophesize(Foo::class); $foo->reveal()->getBar(); } }Use intention / generator to add new method mocks. Every caret position inside a mock object is detected
$foo = $this->getMockBuilder(Foobar::class)->getMock(); $foo->method('getFoobar')->willReturn(); $foo = $this->createMock(Foobar::class); $foo->method('getFoobar')->willReturn();$this->foobar = $this->getMockBuilder(Foobar::class)->getMock(); // ... $this->foobar->method('getFoobar')->willReturn(); $this->foobar = $this->createMock(Foobar::class); // ... $this->foobar->method('getFoobar')->willReturn();new Foobar(); // ... new Foobar( $this->createMock(Foo::class), $this->createMock(FooBar::class) );/** * @expectedException \Foo\FooException */ public function testExpectedException() { $foo = new FooBar(); $foo->throwFooException(); }Has support for
- Method referencing and autocomplete for method string in
allows,expects,shouldReceive,shouldNotReceive,shouldHaveReceived,shouldNotHaveReceived. As well as in Generated partial mocks. - Highlighting for incorrect methods used inside an
allowsetc., when method is private, protected, or not found. - Type providers to enable new Mockery syntax:
$mock->allows()->foo('arg')->andReturns('mocked_result'). - Configurable inspection for replacing legacy Mockery syntax: replacing
$mock->shouldReceive("foo")->with("arg")->andReturn("result")with$mock->allows()->foo("arg")->andReturns("result").
In the following code snippets referencing, autocompletion, and refactoring are supported at the carets. Note that these all work with aliases, overloaded mocks, proxies, and partial mocks.
class Foo extends Mockery\Adapter\Phpunit\MockeryTestCase { protected function setUp(): void { $mock = Mockery::mock('MockeryPlugin\DemoProject\Dependency'); $mock->allows('fo<caret>o'); $mock->expects('f<caret>oo'); $mock->shouldReceive('ba<caret>r'); $mock->shouldNotReceive('b<caret>ar'); } }class Foo extends Mockery\Adapter\Phpunit\MockeryTestCase { protected function setUp(): void { $this->mock = Mockery::mock('MockeryPlugin\DemoProject\Dependency'); } public function test(): void { $this->mock->allows('fo<caret>o')->andReturns('result'); } }class Foo extends Mockery\Adapter\Phpunit\MockeryTestCase { protected function setUp(): void { $mock = Mockery::spy('MockeryPlugin\DemoProject\Dependency'); // ... $mock->shouldHaveReceived('b<caret>ar'); $mock->shouldNotHaveReceived('fo<caret>o'); } }class Foo extends Mockery\Adapter\Phpunit\MockeryTestCase { protected function setUp(): void { $mock = Mockery::mock('MockeryPlugin\DemoProject\Dependency'); $mock->shouldReceive('foo', 'b<caret>ar') $mock->shouldReceive([ 'foo' => 'mocked result', 'ba<caret>r' => 'mocked result' ]); } }Method name referencing/refactoring is supported when creating generated partial mocks.
class Foo extends Mockery\Adapter\Phpunit\MockeryTestCase { protected function setUp(): void { $mock = Mockery::mock(Dependency::class . "[f<caret>oo]"); $mock = Mockery::mock('MockeryPlugin\DemoProject\Dependency[f<caret>oo]'); } }A warning highlight is given when the method being used is protected, private, or not found.
class Foo extends Mockery\Adapter\Phpunit\MockeryTestCase { protected function setUp(): void { $mock = Mockery::mock(Dependency::class); $mock->expects('protectedMethod'); $mock->expects('privateMethod'); $mock->expects('unknownMethod'); } }An inspection is provided which will highlight legacy mockery syntax and provides a quick fix to update. Legacy Mockery uses shouldReceive/shouldNotReceive, and it gets replaced by allows/expects, e.g.
class Foo extends Mockery\Adapter\Phpunit\MockeryTestCase { protected function setUp(): void { $mock = Mockery::mock(Dependency::class); $mock->shouldReceive('foo')->with('arg')->andReturn('result'); // replaced by $mock->allows('foo')->with('arg')->andReturns('result'); $mock->shouldReceive('foo')->with('arg')->andReturn('result')->once(); // replaced by $mock->expects('foo')->with('arg')->andReturns('result'); } }If a shouldReceive has multiple method parameters then these will get combined into an array parameter. But the inspection can be configured to prefer writing multiple allows/expects statements.
class Foo extends Mockery\Adapter\Phpunit\MockeryTestCase { protected function setUp(): void { $mock = Mockery::mock(Dependency::class); $mock->$this->dependency->shouldReceive('foo', 'bar'); // replaced by $mock->allows(['foo', 'bar']); $mock->shouldReceive('foo', 'bar')->andReturns('mocked result'); // replaced by $mock->allows(['foo' => 'mocked result', 'bar' => 'mocked result']); } }class Foo extends Mockery\Adapter\Phpunit\MockeryTestCase { protected function setUp(): void { $mock = Mockery::mock(Dependency::class); $mock->$this->dependency->shouldReceive('foo', 'bar'); // replaced by $this->dependency->allows('foo'); $this->dependency->allows('bar'); $mock->shouldReceive('foo', 'bar')->andReturns('mocked result'); // replaced by $this->dependency->allows('foo')->andReturns('mocked result'); $this->dependency->allows('bar')->andReturns('mocked result'); } }The inspection can also be configured to prefer the new Mockery syntax in which the mocked methods are called like normal rather than as a string.
class Foo extends Mockery\Adapter\Phpunit\MockeryTestCase { protected function setUp(): void { $mock = Mockery::mock(Dependency::class); $mock->shouldReceive('foo')->with('arg')->andReturn('result'); // replaced by $mock->allows()->foo('arg')->andReturns('result'); $mock->shouldReceive('foo')->with('arg')->andReturn('result')->once(); // replaced by $mock->expects()->foo('arg')->andReturns('result'); } }Type providers are implemented so that when calling allows() on a mock it will have the type of the mocked class. Further allows()->foo() will be given the type Mockery/Expectation so that methods like andReturns(..) work as expected. This extends also to expects(), shouldReceive(), shouldNotReceive() and shouldHaveReceived(). Note: this new syntax does not extend tp shouldNotHaveReceived.
In the following example the first caret has type Dependency, and the second type Expectation.
$mock = Mockery::mock(Dependency::class); $mock->allows<caret>()->foo<caret>('arg')->andReturns('result');




