Blame | Letzte Änderung | Log anzeigen | RSS feed
.. index::single: PHPUnit IntegrationPHPUnit Integration===================Mockery was designed as a simple-to-use *standalone* mock object framework, soits need for integration with any testing framework is entirely optional. Tointegrate Mockery, we need to define a ``tearDown()`` method for our testscontaining the following (we may use a shorter ``\Mockery`` namespacealias):.. code-block:: phppublic function tearDown() {\Mockery::close();}This static call cleans up the Mockery container used by the current test, andrun any verification tasks needed for our expectations.For some added brevity when it comes to using Mockery, we can also explicitlyuse the Mockery namespace with a shorter alias. For example:.. code-block:: phpuse \Mockery as m;class SimpleTest extends \PHPUnit\Framework\TestCase{public function testSimpleMock() {$mock = m::mock('simplemock');$mock->shouldReceive('foo')->with(5, m::any())->once()->andReturn(10);$this->assertEquals(10, $mock->foo(5));}public function tearDown() {m::close();}}Mockery ships with an autoloader so we don't need to litter our tests with``require_once()`` calls. To use it, ensure Mockery is on our``include_path`` and add the following to our test suite's ``Bootstrap.php``or ``TestHelper.php`` file:.. code-block:: phprequire_once 'Mockery/Loader.php';require_once 'Hamcrest/Hamcrest.php';$loader = new \Mockery\Loader;$loader->register();If we are using Composer, we can simplify this to including the Composergenerated autoloader file:.. code-block:: phprequire __DIR__ . '/../vendor/autoload.php'; // assuming vendor is one directory up.. caution::Prior to Hamcrest 1.0.0, the ``Hamcrest.php`` file name had a small "h"(i.e. ``hamcrest.php``). If upgrading Hamcrest to 1.0.0 remember to checkthe file name is updated for all your projects.)To integrate Mockery into PHPUnit and avoid having to call the close methodand have Mockery remove itself from code coverage reports, have your test caseextends the ``\Mockery\Adapter\Phpunit\MockeryTestCase``:.. code-block:: phpclass MyTest extends \Mockery\Adapter\Phpunit\MockeryTestCase{}An alternative is to use the supplied trait:.. code-block:: phpclass MyTest extends \PHPUnit\Framework\TestCase{use \Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;}Extending ``MockeryTestCase`` or using the ``MockeryPHPUnitIntegration``trait is **the recommended way** of integrating Mockery with PHPUnit,since Mockery 1.0.0.PHPUnit listener----------------Before the 1.0.0 release, Mockery provided a PHPUnit listener that wouldcall ``Mockery::close()`` for us at the end of a test. This has changedsignificantly since the 1.0.0 version.Now, Mockery provides a PHPUnit listener that makes tests fail if``Mockery::close()`` has not been called. It can help identify tests wherewe've forgotten to include the trait or extend the ``MockeryTestCase``.If we are using PHPUnit's XML configuration approach, we can include thefollowing to load the ``TestListener``:.. code-block:: xml<listeners><listener class="\Mockery\Adapter\Phpunit\TestListener"></listener></listeners>Make sure Composer's or Mockery's autoloader is present in the bootstrap fileor we will need to also define a "file" attribute pointing to the file of the``TestListener`` class.If we are creating the test suite programmatically we may add the listenerlike this:.. code-block:: php// Create the suite.$suite = new PHPUnit\Framework\TestSuite();// Create the listener and add it to the suite.$result = new PHPUnit\Framework\TestResult();$result->addListener(new \Mockery\Adapter\Phpunit\TestListener());// Run the tests.$suite->run($result);.. caution::PHPUnit provides a functionality that allows`tests to run in a separated process <http://phpunit.de/manual/current/en/appendixes.annotations.html#appendixes.annotations.runTestsInSeparateProcesses>`_,to ensure better isolation. Mockery verifies the mocks expectations using the``Mockery::close()`` method, and provides a PHPUnit listener, that automaticallycalls this method for us after every test.However, this listener is not called in the right process when usingPHPUnit's process isolation, resulting in expectations that might not berespected, but without raising any ``Mockery\Exception``. To avoid this,we cannot rely on the supplied Mockery PHPUnit ``TestListener``, and we needto explicitly call ``Mockery::close``. The easiest solution to include thiscall in the ``tearDown()`` method, as explained previously.