diff vendor/phpunit/phpunit-mock-objects/tests/MockObjectTest.php @ 14:1fec387a4317

Update Drupal core to 8.5.2 via Composer
author Chris Cannam
date Mon, 23 Apr 2018 09:46:53 +0100
parents 4c8ae668cc8c
children 129ea1e6d783
line wrap: on
line diff
--- a/vendor/phpunit/phpunit-mock-objects/tests/MockObjectTest.php	Mon Apr 23 09:33:26 2018 +0100
+++ b/vendor/phpunit/phpunit-mock-objects/tests/MockObjectTest.php	Mon Apr 23 09:46:53 2018 +0100
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHPUnit_MockObject package.
+ * This file is part of the phpunit-mock-objects package.
  *
  * (c) Sebastian Bergmann <sebastian@phpunit.de>
  *
@@ -8,46 +8,61 @@
  * file that was distributed with this source code.
  */
 
-/**
- *
- *
- * @since      Class available since Release 3.0.0
- */
-class Framework_MockObjectTest extends PHPUnit_Framework_TestCase
+use PHPUnit\Framework\MockObject\MockObject;
+use PHPUnit\Framework\TestCase;
+use PHPUnit\Framework\ExpectationFailedException;
+
+class MockObjectTest extends TestCase
 {
     public function testMockedMethodIsNeverCalled()
     {
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->never())
              ->method('doSomething');
     }
 
     public function testMockedMethodIsNeverCalledWithParameter()
     {
-        $mock = $this->getMock('SomeClass');
+        $mock = $this->getMockBuilder(SomeClass::class)
+                     ->getMock();
+
         $mock->expects($this->never())
-            ->method('doSomething')
-            ->with('someArg');
+             ->method('doSomething')
+             ->with('someArg');
     }
 
+    /**
+     * @doesNotPerformAssertions
+     */
     public function testMockedMethodIsNotCalledWhenExpectsAnyWithParameter()
     {
-        $mock = $this->getMock('SomeClass');
+        $mock = $this->getMockBuilder(SomeClass::class)
+                     ->getMock();
+
         $mock->expects($this->any())
              ->method('doSomethingElse')
              ->with('someArg');
     }
 
+    /**
+     * @doesNotPerformAssertions
+     */
     public function testMockedMethodIsNotCalledWhenMethodSpecifiedDirectlyWithParameter()
     {
-        $mock = $this->getMock('SomeClass');
+        $mock = $this->getMockBuilder(SomeClass::class)
+                     ->getMock();
+
         $mock->method('doSomethingElse')
-            ->with('someArg');
+             ->with('someArg');
     }
 
     public function testMockedMethodIsCalledAtLeastOnce()
     {
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->atLeastOnce())
              ->method('doSomething');
 
@@ -56,7 +71,9 @@
 
     public function testMockedMethodIsCalledAtLeastOnce2()
     {
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->atLeastOnce())
              ->method('doSomething');
 
@@ -66,7 +83,9 @@
 
     public function testMockedMethodIsCalledAtLeastTwice()
     {
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->atLeast(2))
              ->method('doSomething');
 
@@ -76,7 +95,9 @@
 
     public function testMockedMethodIsCalledAtLeastTwice2()
     {
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->atLeast(2))
              ->method('doSomething');
 
@@ -87,7 +108,9 @@
 
     public function testMockedMethodIsCalledAtMostTwice()
     {
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->atMost(2))
              ->method('doSomething');
 
@@ -97,7 +120,9 @@
 
     public function testMockedMethodIsCalledAtMosttTwice2()
     {
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->atMost(2))
              ->method('doSomething');
 
@@ -106,7 +131,9 @@
 
     public function testMockedMethodIsCalledOnce()
     {
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->once())
              ->method('doSomething');
 
@@ -115,7 +142,9 @@
 
     public function testMockedMethodIsCalledOnceWithParameter()
     {
-        $mock = $this->getMock('SomeClass');
+        $mock = $this->getMockBuilder(SomeClass::class)
+                     ->getMock();
+
         $mock->expects($this->once())
              ->method('doSomethingElse')
              ->with($this->equalTo('something'));
@@ -125,7 +154,9 @@
 
     public function testMockedMethodIsCalledExactly()
     {
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->exactly(2))
              ->method('doSomething');
 
@@ -135,46 +166,46 @@
 
     public function testStubbedException()
     {
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->any())
              ->method('doSomething')
-             ->will($this->throwException(new Exception));
+             ->will($this->throwException(new \Exception()));
 
-        try {
-            $mock->doSomething();
-        } catch (Exception $e) {
-            return;
-        }
+        $this->expectException(\Exception::class);
 
-        $this->fail();
+        $mock->doSomething();
     }
 
     public function testStubbedWillThrowException()
     {
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->any())
              ->method('doSomething')
-             ->willThrowException(new Exception);
+             ->willThrowException(new \Exception());
 
-        try {
-            $mock->doSomething();
-        } catch (Exception $e) {
-            return;
-        }
+        $this->expectException(\Exception::class);
 
-        $this->fail();
+        $mock->doSomething();
     }
 
     public function testStubbedReturnValue()
     {
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->any())
              ->method('doSomething')
              ->will($this->returnValue('something'));
 
         $this->assertEquals('something', $mock->doSomething());
 
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->any())
              ->method('doSomething')
              ->willReturn('something');
@@ -184,12 +215,14 @@
 
     public function testStubbedReturnValueMap()
     {
-        $map = array(
-            array('a', 'b', 'c', 'd'),
-            array('e', 'f', 'g', 'h')
-        );
+        $map = [
+            ['a', 'b', 'c', 'd'],
+            ['e', 'f', 'g', 'h']
+        ];
 
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->any())
              ->method('doSomething')
              ->will($this->returnValueMap($map));
@@ -198,7 +231,9 @@
         $this->assertEquals('h', $mock->doSomething('e', 'f', 'g'));
         $this->assertEquals(null, $mock->doSomething('foo', 'bar'));
 
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->any())
              ->method('doSomething')
              ->willReturnMap($map);
@@ -210,14 +245,18 @@
 
     public function testStubbedReturnArgument()
     {
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->any())
              ->method('doSomething')
              ->will($this->returnArgument(1));
 
         $this->assertEquals('b', $mock->doSomething('a', 'b'));
 
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->any())
              ->method('doSomething')
              ->willReturnArgument(1);
@@ -227,14 +266,20 @@
 
     public function testFunctionCallback()
     {
-        $mock = $this->getMock('SomeClass', array('doSomething'), array(), '', false);
+        $mock = $this->getMockBuilder(SomeClass::class)
+                     ->setMethods(['doSomething'])
+                     ->getMock();
+
         $mock->expects($this->once())
              ->method('doSomething')
              ->will($this->returnCallback('functionCallback'));
 
         $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
 
-        $mock = $this->getMock('SomeClass', array('doSomething'), array(), '', false);
+        $mock = $this->getMockBuilder(SomeClass::class)
+                     ->setMethods(['doSomething'])
+                     ->getMock();
+
         $mock->expects($this->once())
              ->method('doSomething')
              ->willReturnCallback('functionCallback');
@@ -244,14 +289,18 @@
 
     public function testStubbedReturnSelf()
     {
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->any())
              ->method('doSomething')
              ->will($this->returnSelf());
 
         $this->assertEquals($mock, $mock->doSomething());
 
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->any())
              ->method('doSomething')
              ->willReturnSelf();
@@ -261,7 +310,9 @@
 
     public function testStubbedReturnOnConsecutiveCalls()
     {
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->any())
              ->method('doSomething')
              ->will($this->onConsecutiveCalls('a', 'b', 'c'));
@@ -270,7 +321,9 @@
         $this->assertEquals('b', $mock->doSomething());
         $this->assertEquals('c', $mock->doSomething());
 
-        $mock = $this->getMock('AnInterface');
+        $mock = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
         $mock->expects($this->any())
              ->method('doSomething')
              ->willReturnOnConsecutiveCalls('a', 'b', 'c');
@@ -282,39 +335,61 @@
 
     public function testStaticMethodCallback()
     {
-        $mock = $this->getMock('SomeClass', array('doSomething'), array(), '', false);
+        $mock = $this->getMockBuilder(SomeClass::class)
+                     ->setMethods(['doSomething'])
+                     ->getMock();
+
         $mock->expects($this->once())
              ->method('doSomething')
-             ->will($this->returnCallback(array('MethodCallback', 'staticCallback')));
+             ->will($this->returnCallback(['MethodCallback', 'staticCallback']));
 
         $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
     }
 
     public function testPublicMethodCallback()
     {
-        $mock = $this->getMock('SomeClass', array('doSomething'), array(), '', false);
+        $mock = $this->getMockBuilder(SomeClass::class)
+                     ->setMethods(['doSomething'])
+                     ->getMock();
+
         $mock->expects($this->once())
              ->method('doSomething')
-             ->will($this->returnCallback(array(new MethodCallback, 'nonStaticCallback')));
+             ->will($this->returnCallback([new MethodCallback, 'nonStaticCallback']));
 
         $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
     }
 
     public function testMockClassOnlyGeneratedOnce()
     {
-        $mock1 = $this->getMock('AnInterface');
-        $mock2 = $this->getMock('AnInterface');
+        $mock1 = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
+
+        $mock2 = $this->getMockBuilder(AnInterface::class)
+                     ->getMock();
 
         $this->assertEquals(get_class($mock1), get_class($mock2));
     }
 
     public function testMockClassDifferentForPartialMocks()
     {
-        $mock1 = $this->getMock('PartialMockTestClass');
-        $mock2 = $this->getMock('PartialMockTestClass', array('doSomething'));
-        $mock3 = $this->getMock('PartialMockTestClass', array('doSomething'));
-        $mock4 = $this->getMock('PartialMockTestClass', array('doAnotherThing'));
-        $mock5 = $this->getMock('PartialMockTestClass', array('doAnotherThing'));
+        $mock1 = $this->getMockBuilder(PartialMockTestClass::class)
+                      ->getMock();
+
+        $mock2 = $this->getMockBuilder(PartialMockTestClass::class)
+                      ->setMethods(['doSomething'])
+                      ->getMock();
+
+        $mock3 = $this->getMockBuilder(PartialMockTestClass::class)
+                      ->setMethods(['doSomething'])
+                      ->getMock();
+
+        $mock4 = $this->getMockBuilder(PartialMockTestClass::class)
+                      ->setMethods(['doAnotherThing'])
+                      ->getMock();
+
+        $mock5 = $this->getMockBuilder(PartialMockTestClass::class)
+                      ->setMethods(['doAnotherThing'])
+                      ->getMock();
 
         $this->assertNotEquals(get_class($mock1), get_class($mock2));
         $this->assertNotEquals(get_class($mock1), get_class($mock3));
@@ -328,11 +403,24 @@
 
     public function testMockClassStoreOverrulable()
     {
-        $mock1 = $this->getMock('PartialMockTestClass');
-        $mock2 = $this->getMock('PartialMockTestClass', array(), array(), 'MyMockClassNameForPartialMockTestClass1');
-        $mock3 = $this->getMock('PartialMockTestClass');
-        $mock4 = $this->getMock('PartialMockTestClass', array('doSomething'), array(), 'AnotherMockClassNameForPartialMockTestClass');
-        $mock5 = $this->getMock('PartialMockTestClass', array(), array(), 'MyMockClassNameForPartialMockTestClass2');
+        $mock1 = $this->getMockBuilder(PartialMockTestClass::class)
+                      ->getMock();
+
+        $mock2 = $this->getMockBuilder(PartialMockTestClass::class)
+                      ->setMockClassName('MyMockClassNameForPartialMockTestClass1')
+                      ->getMock();
+
+        $mock3 = $this->getMockBuilder(PartialMockTestClass::class)
+                      ->getMock();
+
+        $mock4 = $this->getMockBuilder(PartialMockTestClass::class)
+                      ->setMethods(['doSomething'])
+                      ->setMockClassName('AnotherMockClassNameForPartialMockTestClass')
+                      ->getMock();
+
+        $mock5 = $this->getMockBuilder(PartialMockTestClass::class)
+                      ->setMockClassName('MyMockClassNameForPartialMockTestClass2')
+                      ->getMock();
 
         $this->assertNotEquals(get_class($mock1), get_class($mock2));
         $this->assertEquals(get_class($mock1), get_class($mock3));
@@ -345,20 +433,21 @@
         $this->assertNotEquals(get_class($mock4), get_class($mock5));
     }
 
-    /**
-     * @covers PHPUnit_Framework_MockObject_Generator::getMock
-     */
     public function testGetMockWithFixedClassNameCanProduceTheSameMockTwice()
     {
-        $mock = $this->getMockBuilder('StdClass')->setMockClassName('FixedName')->getMock();
-        $mock = $this->getMockBuilder('StdClass')->setMockClassName('FixedName')->getMock();
-        $this->assertInstanceOf('StdClass', $mock);
+        $mock = $this->getMockBuilder(stdClass::class)->setMockClassName('FixedName')->getMock();
+        $mock = $this->getMockBuilder(stdClass::class)->setMockClassName('FixedName')->getMock();
+        $this->assertInstanceOf(stdClass::class, $mock);
     }
 
     public function testOriginalConstructorSettingConsidered()
     {
-        $mock1 = $this->getMock('PartialMockTestClass');
-        $mock2 = $this->getMock('PartialMockTestClass', array(), array(), '', false);
+        $mock1 = $this->getMockBuilder(PartialMockTestClass::class)
+                      ->getMock();
+
+        $mock2 = $this->getMockBuilder(PartialMockTestClass::class)
+                      ->disableOriginalConstructor()
+                      ->getMock();
 
         $this->assertTrue($mock1->constructorCalled);
         $this->assertFalse($mock2->constructorCalled);
@@ -366,118 +455,146 @@
 
     public function testOriginalCloneSettingConsidered()
     {
-        $mock1 = $this->getMock('PartialMockTestClass');
-        $mock2 = $this->getMock('PartialMockTestClass', array(), array(), '', true, false);
+        $mock1 = $this->getMockBuilder(PartialMockTestClass::class)
+                      ->getMock();
+
+        $mock2 = $this->getMockBuilder(PartialMockTestClass::class)
+                      ->disableOriginalClone()
+                      ->getMock();
 
         $this->assertNotEquals(get_class($mock1), get_class($mock2));
     }
 
     public function testGetMockForAbstractClass()
     {
-        $mock = $this->getMock('AbstractMockTestClass');
+        $mock = $this->getMockBuilder(AbstractMockTestClass::class)
+                     ->getMock();
+
         $mock->expects($this->never())
              ->method('doSomething');
     }
 
-    public function traversableProvider()
-    {
-        return array(
-          array('Traversable'),
-          array('\Traversable'),
-          array('TraversableMockTestInterface'),
-          array(array('Traversable')),
-          array(array('Iterator','Traversable')),
-          array(array('\Iterator','\Traversable'))
-        );
-    }
-
     /**
      * @dataProvider traversableProvider
      */
     public function testGetMockForTraversable($type)
     {
-        $mock = $this->getMock($type);
-        $this->assertInstanceOf('Traversable', $mock);
+        $mock = $this->getMockBuilder($type)
+                     ->getMock();
+
+        $this->assertInstanceOf(Traversable::class, $mock);
     }
 
     public function testMultipleInterfacesCanBeMockedInSingleObject()
     {
-        $mock = $this->getMock(array('AnInterface', 'AnotherInterface'));
-        $this->assertInstanceOf('AnInterface', $mock);
-        $this->assertInstanceOf('AnotherInterface', $mock);
+        $mock = $this->getMockBuilder([AnInterface::class, AnotherInterface::class])
+                     ->getMock();
+
+        $this->assertInstanceOf(AnInterface::class, $mock);
+        $this->assertInstanceOf(AnotherInterface::class, $mock);
     }
 
-    /**
-     * @requires PHP 5.4.0
-     */
     public function testGetMockForTrait()
     {
-        $mock = $this->getMockForTrait('AbstractTrait');
-        $mock->expects($this->never())->method('doSomething');
+        $mock = $this->getMockForTrait(AbstractTrait::class);
+
+        $mock->expects($this->never())
+             ->method('doSomething');
 
         $parent = get_parent_class($mock);
         $traits = class_uses($parent, false);
 
-        $this->assertContains('AbstractTrait', $traits);
+        $this->assertContains(AbstractTrait::class, $traits);
     }
 
     public function testClonedMockObjectShouldStillEqualTheOriginal()
     {
-        $a = $this->getMock('stdClass');
+        $a = $this->getMockBuilder(stdClass::class)
+                  ->getMock();
+
         $b = clone $a;
+
         $this->assertEquals($a, $b);
     }
 
     public function testMockObjectsConstructedIndepentantlyShouldBeEqual()
     {
-        $a = $this->getMock('stdClass');
-        $b = $this->getMock('stdClass');
+        $a = $this->getMockBuilder(stdClass::class)
+                  ->getMock();
+
+        $b = $this->getMockBuilder(stdClass::class)
+                  ->getMock();
+
         $this->assertEquals($a, $b);
     }
 
     public function testMockObjectsConstructedIndepentantlyShouldNotBeTheSame()
     {
-        $a = $this->getMock('stdClass');
-        $b = $this->getMock('stdClass');
+        $a = $this->getMockBuilder(stdClass::class)
+                  ->getMock();
+
+        $b = $this->getMockBuilder(stdClass::class)
+                  ->getMock();
+
         $this->assertNotSame($a, $b);
     }
 
     public function testClonedMockObjectCanBeUsedInPlaceOfOriginalOne()
     {
-        $x = $this->getMock('stdClass');
+        $x = $this->getMockBuilder(stdClass::class)
+                  ->getMock();
+
         $y = clone $x;
 
-        $mock = $this->getMock('stdClass', array('foo'));
-        $mock->expects($this->once())->method('foo')->with($this->equalTo($x));
+        $mock = $this->getMockBuilder(stdClass::class)
+                     ->setMethods(['foo'])
+                     ->getMock();
+
+        $mock->expects($this->once())
+             ->method('foo')
+             ->with($this->equalTo($x));
+
         $mock->foo($y);
     }
 
     public function testClonedMockObjectIsNotIdenticalToOriginalOne()
     {
-        $x = $this->getMock('stdClass');
+        $x = $this->getMockBuilder(stdClass::class)
+                  ->getMock();
+
         $y = clone $x;
 
-        $mock = $this->getMock('stdClass', array('foo'));
-        $mock->expects($this->once())->method('foo')->with($this->logicalNot($this->identicalTo($x)));
+        $mock = $this->getMockBuilder(stdClass::class)
+                     ->setMethods(['foo'])
+                     ->getMock();
+
+        $mock->expects($this->once())
+             ->method('foo')
+             ->with($this->logicalNot($this->identicalTo($x)));
+
         $mock->foo($y);
     }
 
     public function testObjectMethodCallWithArgumentCloningEnabled()
     {
-        $expectedObject = new StdClass;
+        $expectedObject = new stdClass;
 
         $mock = $this->getMockBuilder('SomeClass')
-                     ->setMethods(array('doSomethingElse'))
+                     ->setMethods(['doSomethingElse'])
                      ->enableArgumentCloning()
                      ->getMock();
 
-        $actualArguments = array();
+        $actualArguments = [];
 
         $mock->expects($this->any())
-        ->method('doSomethingElse')
-        ->will($this->returnCallback(function () use (&$actualArguments) {
-            $actualArguments = func_get_args();
-        }));
+             ->method('doSomethingElse')
+             ->will(
+                 $this->returnCallback(
+                     function () use (&$actualArguments) {
+                         $actualArguments = func_get_args();
+                     }
+                 )
+             );
 
         $mock->doSomethingElse($expectedObject);
 
@@ -488,20 +605,24 @@
 
     public function testObjectMethodCallWithArgumentCloningDisabled()
     {
-        $expectedObject = new StdClass;
+        $expectedObject = new stdClass;
 
         $mock = $this->getMockBuilder('SomeClass')
-                     ->setMethods(array('doSomethingElse'))
+                     ->setMethods(['doSomethingElse'])
                      ->disableArgumentCloning()
                      ->getMock();
 
-        $actualArguments = array();
+        $actualArguments = [];
 
         $mock->expects($this->any())
-        ->method('doSomethingElse')
-        ->will($this->returnCallback(function () use (&$actualArguments) {
-            $actualArguments = func_get_args();
-        }));
+             ->method('doSomethingElse')
+             ->will(
+                 $this->returnCallback(
+                     function () use (&$actualArguments) {
+                         $actualArguments = func_get_args();
+                     }
+                 )
+             );
 
         $mock->doSomethingElse($expectedObject);
 
@@ -512,12 +633,12 @@
     public function testArgumentCloningOptionGeneratesUniqueMock()
     {
         $mockWithCloning = $this->getMockBuilder('SomeClass')
-                                ->setMethods(array('doSomethingElse'))
+                                ->setMethods(['doSomethingElse'])
                                 ->enableArgumentCloning()
                                 ->getMock();
 
         $mockWithoutCloning = $this->getMockBuilder('SomeClass')
-                                   ->setMethods(array('doSomethingElse'))
+                                   ->setMethods(['doSomethingElse'])
                                    ->disableArgumentCloning()
                                    ->getMock();
 
@@ -526,18 +647,22 @@
 
     public function testVerificationOfMethodNameFailsWithoutParameters()
     {
-        $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', true, true, true);
+        $mock = $this->getMockBuilder(SomeClass::class)
+                     ->setMethods(['right', 'wrong'])
+                     ->getMock();
+
         $mock->expects($this->once())
              ->method('right');
 
         $mock->wrong();
+
         try {
             $mock->__phpunit_verify();
             $this->fail('Expected exception');
-        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+        } catch (ExpectationFailedException $e) {
             $this->assertSame(
-                "Expectation failed for method name is equal to <string:right> when invoked 1 time(s).\n"
-                . "Method was expected to be called 1 times, actually called 0 times.\n",
+                'Expectation failed for method name is equal to "right" when invoked 1 time(s).' . PHP_EOL .
+                'Method was expected to be called 1 times, actually called 0 times.' . PHP_EOL,
                 $e->getMessage()
             );
         }
@@ -547,18 +672,22 @@
 
     public function testVerificationOfMethodNameFailsWithParameters()
     {
-        $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', true, true, true);
+        $mock = $this->getMockBuilder(SomeClass::class)
+                     ->setMethods(['right', 'wrong'])
+                     ->getMock();
+
         $mock->expects($this->once())
              ->method('right');
 
         $mock->wrong();
+
         try {
             $mock->__phpunit_verify();
             $this->fail('Expected exception');
-        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+        } catch (ExpectationFailedException $e) {
             $this->assertSame(
-                "Expectation failed for method name is equal to <string:right> when invoked 1 time(s).\n"
-                . "Method was expected to be called 1 times, actually called 0 times.\n",
+                'Expectation failed for method name is equal to "right" when invoked 1 time(s).' . PHP_EOL .
+                'Method was expected to be called 1 times, actually called 0 times.' . PHP_EOL,
                 $e->getMessage()
             );
         }
@@ -568,38 +697,43 @@
 
     public function testVerificationOfMethodNameFailsWithWrongParameters()
     {
-        $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', true, true, true);
+        $mock = $this->getMockBuilder(SomeClass::class)
+                     ->setMethods(['right', 'wrong'])
+                     ->getMock();
+
         $mock->expects($this->once())
              ->method('right')
-             ->with(array('first', 'second'));
+             ->with(['first', 'second']);
 
         try {
-            $mock->right(array('second'));
-        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $mock->right(['second']);
+        } catch (ExpectationFailedException $e) {
             $this->assertSame(
-                "Expectation failed for method name is equal to <string:right> when invoked 1 time(s)\n"
-                . "Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.\n"
-                . "Failed asserting that two arrays are equal.",
+                'Expectation failed for method name is equal to "right" when invoked 1 time(s)' . PHP_EOL .
+                'Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.' . PHP_EOL .
+                'Failed asserting that two arrays are equal.',
                 $e->getMessage()
             );
         }
 
         try {
             $mock->__phpunit_verify();
-            $this->fail('Expected exception');
-        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+
+// CHECKOUT THIS MORE CAREFULLY
+//            $this->fail('Expected exception');
+
+        } catch (ExpectationFailedException $e) {
             $this->assertSame(
-                "Expectation failed for method name is equal to <string:right> when invoked 1 time(s).\n"
-                . "Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.\n"
-                . "Failed asserting that two arrays are equal.\n"
-                . "--- Expected\n"
-                . "+++ Actual\n"
-                . "@@ @@\n"
-                . " Array (\n"
-                . "-    0 => 'first'\n"
-                . "-    1 => 'second'\n"
-                . "+    0 => 'second'\n"
-                . " )\n",
+                'Expectation failed for method name is equal to "right" when invoked 1 time(s).' . PHP_EOL .
+                'Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.' . PHP_EOL .
+                'Failed asserting that two arrays are equal.' . PHP_EOL .
+                '--- Expected' . PHP_EOL .
+                '+++ Actual' . PHP_EOL .
+                '@@ @@' . PHP_EOL .
+                ' Array (' . PHP_EOL .
+                '-    0 => \'first\'' . PHP_EOL .
+                '-    1 => \'second\'' . PHP_EOL .
+                '+    0 => \'second\'' . PHP_EOL,
                 $e->getMessage()
             );
         }
@@ -609,7 +743,10 @@
 
     public function testVerificationOfNeverFailsWithEmptyParameters()
     {
-        $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', true, true, true);
+        $mock = $this->getMockBuilder(SomeClass::class)
+                     ->setMethods(['right', 'wrong'])
+                     ->getMock();
+
         $mock->expects($this->never())
              ->method('right')
              ->with();
@@ -617,7 +754,7 @@
         try {
             $mock->right();
             $this->fail('Expected exception');
-        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+        } catch (ExpectationFailedException $e) {
             $this->assertSame(
                 'SomeClass::right() was not expected to be called.',
                 $e->getMessage()
@@ -629,7 +766,10 @@
 
     public function testVerificationOfNeverFailsWithAnyParameters()
     {
-        $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', true, true, true);
+        $mock = $this->getMockBuilder(SomeClass::class)
+                     ->setMethods(['right', 'wrong'])
+                     ->getMock();
+
         $mock->expects($this->never())
              ->method('right')
              ->withAnyParameters();
@@ -637,7 +777,7 @@
         try {
             $mock->right();
             $this->fail('Expected exception');
-        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+        } catch (ExpectationFailedException $e) {
             $this->assertSame(
                 'SomeClass::right() was not expected to be called.',
                 $e->getMessage()
@@ -647,12 +787,12 @@
         $this->resetMockObjects();
     }
 
-    /**
-     * @ticket 199
-     */
     public function testWithAnythingInsteadOfWithAnyParameters()
     {
-        $mock = $this->getMock('SomeClass', array('right'), array(), '', true, true, true);
+        $mock = $this->getMockBuilder(SomeClass::class)
+                     ->setMethods(['right', 'wrong'])
+                     ->getMock();
+
         $mock->expects($this->once())
              ->method('right')
              ->with($this->anything());
@@ -660,11 +800,11 @@
         try {
             $mock->right();
             $this->fail('Expected exception');
-        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+        } catch (ExpectationFailedException $e) {
             $this->assertSame(
-                "Expectation failed for method name is equal to <string:right> when invoked 1 time(s)\n" .
-                "Parameter count for invocation SomeClass::right() is too low.\n" .
-                "To allow 0 or more parameters with any value, omit ->with() or use ->withAnyParameters() instead.",
+                'Expectation failed for method name is equal to "right" when invoked 1 time(s)' . PHP_EOL .
+                'Parameter count for invocation SomeClass::right() is too low.' . PHP_EOL .
+                'To allow 0 or more parameters with any value, omit ->with() or use ->withAnyParameters() instead.',
                 $e->getMessage()
             );
         }
@@ -678,14 +818,14 @@
     public function testMockArgumentsPassedByReference()
     {
         $foo = $this->getMockBuilder('MethodCallbackByReference')
-                    ->setMethods(array('bar'))
+                    ->setMethods(['bar'])
                     ->disableOriginalConstructor()
                     ->disableArgumentCloning()
                     ->getMock();
 
         $foo->expects($this->any())
             ->method('bar')
-            ->will($this->returnCallback(array($foo, 'callback')));
+            ->will($this->returnCallback([$foo, 'callback']));
 
         $a = $b = $c = 0;
 
@@ -720,47 +860,47 @@
     }
 
     /**
-     * https://github.com/sebastianbergmann/phpunit-mock-objects/issues/116
+     * @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/116
      */
     public function testMockArgumentsPassedByReference3()
     {
         $foo = $this->getMockBuilder('MethodCallbackByReference')
-                    ->setMethods(array('bar'))
+                    ->setMethods(['bar'])
                     ->disableOriginalConstructor()
                     ->disableArgumentCloning()
                     ->getMock();
 
-        $a = new stdClass();
+        $a = new stdClass;
         $b = $c = 0;
 
         $foo->expects($this->any())
             ->method('bar')
             ->with($a, $b, $c)
-            ->will($this->returnCallback(array($foo, 'callback')));
+            ->will($this->returnCallback([$foo, 'callback']));
 
-        $foo->bar($a, $b, $c);
+        $this->assertNull($foo->bar($a, $b, $c));
     }
 
     /**
-     * https://github.com/sebastianbergmann/phpunit/issues/796
+     * @see https://github.com/sebastianbergmann/phpunit/issues/796
      */
     public function testMockArgumentsPassedByReference4()
     {
         $foo = $this->getMockBuilder('MethodCallbackByReference')
-                    ->setMethods(array('bar'))
+                    ->setMethods(['bar'])
                     ->disableOriginalConstructor()
                     ->disableArgumentCloning()
                     ->getMock();
 
-        $a = new stdClass();
+        $a = new stdClass;
         $b = $c = 0;
 
         $foo->expects($this->any())
             ->method('bar')
-            ->with($this->isInstanceOf("stdClass"), $b, $c)
-            ->will($this->returnCallback(array($foo, 'callback')));
+            ->with($this->isInstanceOf(stdClass::class), $b, $c)
+            ->will($this->returnCallback([$foo, 'callback']));
 
-        $foo->bar($a, $b, $c);
+        $this->assertNull($foo->bar($a, $b, $c));
     }
 
     /**
@@ -769,6 +909,7 @@
     public function testCreateMockFromWsdl()
     {
         $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl', 'WsdlMock');
+
         $this->assertStringStartsWith(
             'Mock_WsdlMock_',
             get_class($mock)
@@ -781,6 +922,7 @@
     public function testCreateNamespacedMockFromWsdl()
     {
         $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl', 'My\\Space\\WsdlMock');
+
         $this->assertStringStartsWith(
             'Mock_WsdlMock_',
             get_class($mock)
@@ -792,8 +934,11 @@
      */
     public function testCreateTwoMocksOfOneWsdlFile()
     {
-        $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl');
-        $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl');
+        $a = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl');
+        $b = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl');
+
+        $this->assertStringStartsWith('Mock_GoogleSearch_', get_class($a));
+        $this->assertEquals(get_class($a), get_class($b));
     }
 
     /**
@@ -803,17 +948,17 @@
     public function testInterfaceWithStaticMethodCanBeStubbed()
     {
         $this->assertInstanceOf(
-            'InterfaceWithStaticMethod',
-            $this->getMock('InterfaceWithStaticMethod')
+            InterfaceWithStaticMethod::class,
+            $this->getMockBuilder(InterfaceWithStaticMethod::class)->getMock()
         );
     }
 
-    /**
-     * @expectedException PHPUnit_Framework_MockObject_BadMethodCallException
-     */
     public function testInvokingStubbedStaticMethodRaisesException()
     {
-        $mock = $this->getMock('ClassWithStaticMethod');
+        $mock = $this->getMockBuilder(ClassWithStaticMethod::class)->getMock();
+
+        $this->expectException(\PHPUnit\Framework\MockObject\BadMethodCallException::class);
+
         $mock->staticMethod();
     }
 
@@ -824,19 +969,107 @@
     public function testStubForClassThatImplementsSerializableCanBeCreatedWithoutInvokingTheConstructor()
     {
         $this->assertInstanceOf(
-            'ClassThatImplementsSerializable',
-            $this->getMockBuilder('ClassThatImplementsSerializable')
+            ClassThatImplementsSerializable::class,
+            $this->getMockBuilder(ClassThatImplementsSerializable::class)
                  ->disableOriginalConstructor()
                  ->getMock()
         );
     }
 
+    public function testGetMockForClassWithSelfTypeHint()
+    {
+        $this->assertInstanceOf(
+            ClassWithSelfTypeHint::class,
+            $this->getMockBuilder(ClassWithSelfTypeHint::class)->getMock()
+        );
+    }
+
     private function resetMockObjects()
     {
         $refl = new ReflectionObject($this);
         $refl = $refl->getParentClass();
         $prop = $refl->getProperty('mockObjects');
         $prop->setAccessible(true);
-        $prop->setValue($this, array());
+        $prop->setValue($this, []);
+    }
+
+    public function testStringableClassDoesNotThrow()
+    {
+        $mock = $this->getMockBuilder(StringableClass::class)->getMock();
+
+        $this->assertInternalType('string', (string) $mock);
+    }
+
+    public function testStringableClassCanBeMocked()
+    {
+        $mock = $this->getMockBuilder(StringableClass::class)->getMock();
+
+        $mock->method('__toString')->willReturn('foo');
+
+        $this->assertSame('foo', (string) $mock);
+    }
+
+    public function traversableProvider()
+    {
+        return [
+          ['Traversable'],
+          ['\Traversable'],
+          ['TraversableMockTestInterface'],
+          [['Traversable']],
+          [['Iterator','Traversable']],
+          [['\Iterator','\Traversable']]
+        ];
+    }
+
+    public function testParameterCallbackConstraintOnlyEvaluatedOnce()
+    {
+        $mock                  = $this->getMockBuilder(Foo::class)->setMethods(['bar'])->getMock();
+        $expectedNumberOfCalls = 1;
+        $callCount             = 0;
+
+        $mock->expects($this->exactly($expectedNumberOfCalls))->method('bar')
+            ->with($this->callback(function ($argument) use (&$callCount) {
+                return $argument === 'call_' . $callCount++;
+            }));
+
+        for ($i = 0; $i < $expectedNumberOfCalls; $i++) {
+            $mock->bar('call_' . $i);
+        }
+    }
+
+    public function testReturnTypesAreMockedCorrectly()
+    {
+        /** @var ClassWithAllPossibleReturnTypes|MockObject $stub */
+        $stub = $this->createMock(ClassWithAllPossibleReturnTypes::class);
+
+        $this->assertNull($stub->methodWithNoReturnTypeDeclaration());
+        $this->assertSame('', $stub->methodWithStringReturnTypeDeclaration());
+        $this->assertSame(0.0, $stub->methodWithFloatReturnTypeDeclaration());
+        $this->assertSame(0, $stub->methodWithIntReturnTypeDeclaration());
+        $this->assertFalse($stub->methodWithBoolReturnTypeDeclaration());
+        $this->assertSame([], $stub->methodWithArrayReturnTypeDeclaration());
+        $this->assertInstanceOf(MockObject::class, $stub->methodWithClassReturnTypeDeclaration());
+    }
+
+    /**
+     * @requires PHP 7.1
+     */
+    public function testVoidReturnTypeIsMockedCorrectly()
+    {
+        /** @var ClassWithAllPossibleReturnTypes|MockObject $stub */
+        $stub = $this->createMock(ClassWithAllPossibleReturnTypes::class);
+
+        $this->assertNull($stub->methodWithVoidReturnTypeDeclaration());
+    }
+
+    /**
+     * @requires PHP 7.2
+     */
+    public function testObjectReturnTypeIsMockedCorrectly()
+    {
+        /** @var ClassWithAllPossibleReturnTypes|MockObject $stub */
+        $stub = $this->createMock(ClassWithAllPossibleReturnTypes::class);
+
+        $this->assertInstanceOf(stdClass::class, $stub->methodWithObjectReturnTypeDeclaration());
     }
 }