# Quick Reference

The purpose of this page is to give a quick and short overview of some of the most common Mockery features.

Do read the Reference to learn about all the Mockery features.

Integrate Mockery with PHPUnit, either by extending the `MockeryTestCase`:

    use \Mockery\Adapter\Phpunit\MockeryTestCase;

    class MyTest extends MockeryTestCase
    {
    }

or by using the `MockeryPHPUnitIntegration` trait:

    use \PHPUnit\Framework\TestCase;
    use \Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;

    class MyTest extends TestCase
    {
        use MockeryPHPUnitIntegration;
    }

Creating a test double:

    $testDouble = \Mockery::mock('MyClass');

Creating a test double that implements a certain interface:

    $testDouble = \Mockery::mock('MyClass, MyInterface');

Expecting a method to be called on a test double:

    $testDouble = \Mockery::mock('MyClass');
    $testDouble->shouldReceive('foo');

Expecting a method to not be called on a test double:

    $testDouble = \Mockery::mock('MyClass');
    $testDouble->shouldNotReceive('foo');

Expecting a method to be called on a test double, once, with a certain argument, and to return a value:

    $mock = \Mockery::mock('MyClass');
    $mock->shouldReceive('foo')
        ->once()
        ->with($arg)
        ->andReturn($returnValue);

Expecting a method to be called on a test double and to return a different value for each successive call:

    $mock = \Mockery::mock('MyClass');
    $mock->shouldReceive('foo')
        ->andReturn(1, 2, 3);

    $mock->foo(); // int(1);
    $mock->foo(); // int(2);
    $mock->foo(); // int(3);
    $mock->foo(); // int(3);

Creating a runtime partial test double:

    $mock = \Mockery::mock('MyClass')->makePartial();

Creating a spy:

    $spy = \Mockery::spy('MyClass');

Expecting that a spy should have received a method call:

    $spy = \Mockery::spy('MyClass');

    $spy->foo();

    $spy->shouldHaveReceived()->foo();

## Not so simple examples

Creating a mock object to return a sequence of values from a set of method calls:

    use \Mockery\Adapter\Phpunit\MockeryTestCase;

    class SimpleTest extends MockeryTestCase
    {
        public function testSimpleMock()
        {
            $mock = \Mockery::mock(array('pi' => 3.1416, 'e' => 2.71));
            $this->assertEquals(3.1416, $mock->pi());
            $this->assertEquals(2.71, $mock->e());
        }
    }

Creating a mock object which returns a self-chaining Undefined object for a method call:

    use \Mockery\Adapter\Phpunit\MockeryTestCase;

    class UndefinedTest extends MockeryTestCase
    {
        public function testUndefinedValues()
        {
            $mock = \Mockery::mock('mymock');
            $mock->shouldReceive('divideBy')->with(0)->andReturnUndefined();
            $this->assertTrue($mock->divideBy(0) instanceof \Mockery\Undefined);
        }
    }

Creating a mock object with multiple query calls and a single update call:

    use \Mockery\Adapter\Phpunit\MockeryTestCase;

    class DbTest extends MockeryTestCase
    {
        public function testDbAdapter()
        {
            $mock = \Mockery::mock('db');
            $mock->shouldReceive('query')->andReturn(1, 2, 3);
            $mock->shouldReceive('update')->with(5)->andReturn(NULL)->once();

            // ... test code here using the mock
        }
    }

Expecting all queries to be executed before any updates:

    use \Mockery\Adapter\Phpunit\MockeryTestCase;

    class DbTest extends MockeryTestCase
    {
        public function testQueryAndUpdateOrder()
        {
            $mock = \Mockery::mock('db');
            $mock->shouldReceive('query')->andReturn(1, 2, 3)->ordered();
            $mock->shouldReceive('update')->andReturn(NULL)->once()->ordered();

            // ... test code here using the mock
        }
    }

Creating a mock object where all queries occur after startup, but before finish, and where queries are expected with several different params:

    use \Mockery\Adapter\Phpunit\MockeryTestCase;

    class DbTest extends MockeryTestCase
    {
        public function testOrderedQueries()
        {
            $db = \Mockery::mock('db');
            $db->shouldReceive('startup')->once()->ordered();
            $db->shouldReceive('query')->with('CPWR')->andReturn(12.3)->once()->ordered('queries');
            $db->shouldReceive('query')->with('MSFT')->andReturn(10.0)->once()->ordered('queries');
            $db->shouldReceive('query')->with(\Mockery::pattern("/^....$/"))->andReturn(3.3)->atLeast()->once()->ordered('queries');
            $db->shouldReceive('finish')->once()->ordered();

            // ... test code here using the mock
        }
    }