sonarrradarrplexorganizrnginxdashboardlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximux
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							1085 lines
						
					
					
						
							33 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							1085 lines
						
					
					
						
							33 KiB
						
					
					
				| <?php | |
| /* | |
|  * This file is part of the phpunit-mock-objects package. | |
|  * | |
|  * (c) Sebastian Bergmann <sebastian@phpunit.de> | |
|  * | |
|  * For the full copyright and license information, please view the LICENSE | |
|  * file that was distributed with this source code. | |
|  */ | |
| 
 | |
| use PHPUnit\Framework\MockObject\MockObject; | |
| use PHPUnit\Framework\TestCase; | |
| use PHPUnit\Framework\ExpectationFailedException; | |
| 
 | |
| class MockObjectTest extends TestCase | |
| { | |
|     public function testMockedMethodIsNeverCalled() | |
|     { | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->never()) | |
|              ->method('doSomething'); | |
|     } | |
| 
 | |
|     public function testMockedMethodIsNeverCalledWithParameter() | |
|     { | |
|         $mock = $this->getMockBuilder(SomeClass::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->never()) | |
|              ->method('doSomething') | |
|              ->with('someArg'); | |
|     } | |
| 
 | |
|     /** | |
|      * @doesNotPerformAssertions | |
|      */ | |
|     public function testMockedMethodIsNotCalledWhenExpectsAnyWithParameter() | |
|     { | |
|         $mock = $this->getMockBuilder(SomeClass::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->any()) | |
|              ->method('doSomethingElse') | |
|              ->with('someArg'); | |
|     } | |
| 
 | |
|     /** | |
|      * @doesNotPerformAssertions | |
|      */ | |
|     public function testMockedMethodIsNotCalledWhenMethodSpecifiedDirectlyWithParameter() | |
|     { | |
|         $mock = $this->getMockBuilder(SomeClass::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->method('doSomethingElse') | |
|              ->with('someArg'); | |
|     } | |
| 
 | |
|     public function testMockedMethodIsCalledAtLeastOnce() | |
|     { | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->atLeastOnce()) | |
|              ->method('doSomething'); | |
| 
 | |
|         $mock->doSomething(); | |
|     } | |
| 
 | |
|     public function testMockedMethodIsCalledAtLeastOnce2() | |
|     { | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->atLeastOnce()) | |
|              ->method('doSomething'); | |
| 
 | |
|         $mock->doSomething(); | |
|         $mock->doSomething(); | |
|     } | |
| 
 | |
|     public function testMockedMethodIsCalledAtLeastTwice() | |
|     { | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->atLeast(2)) | |
|              ->method('doSomething'); | |
| 
 | |
|         $mock->doSomething(); | |
|         $mock->doSomething(); | |
|     } | |
| 
 | |
|     public function testMockedMethodIsCalledAtLeastTwice2() | |
|     { | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->atLeast(2)) | |
|              ->method('doSomething'); | |
| 
 | |
|         $mock->doSomething(); | |
|         $mock->doSomething(); | |
|         $mock->doSomething(); | |
|     } | |
| 
 | |
|     public function testMockedMethodIsCalledAtMostTwice() | |
|     { | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->atMost(2)) | |
|              ->method('doSomething'); | |
| 
 | |
|         $mock->doSomething(); | |
|         $mock->doSomething(); | |
|     } | |
| 
 | |
|     public function testMockedMethodIsCalledAtMosttTwice2() | |
|     { | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->atMost(2)) | |
|              ->method('doSomething'); | |
| 
 | |
|         $mock->doSomething(); | |
|     } | |
| 
 | |
|     public function testMockedMethodIsCalledOnce() | |
|     { | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->once()) | |
|              ->method('doSomething'); | |
| 
 | |
|         $mock->doSomething(); | |
|     } | |
| 
 | |
|     public function testMockedMethodIsCalledOnceWithParameter() | |
|     { | |
|         $mock = $this->getMockBuilder(SomeClass::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->once()) | |
|              ->method('doSomethingElse') | |
|              ->with($this->equalTo('something')); | |
| 
 | |
|         $mock->doSomethingElse('something'); | |
|     } | |
| 
 | |
|     public function testMockedMethodIsCalledExactly() | |
|     { | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->exactly(2)) | |
|              ->method('doSomething'); | |
| 
 | |
|         $mock->doSomething(); | |
|         $mock->doSomething(); | |
|     } | |
| 
 | |
|     public function testStubbedException() | |
|     { | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->any()) | |
|              ->method('doSomething') | |
|              ->will($this->throwException(new \Exception())); | |
| 
 | |
|         $this->expectException(\Exception::class); | |
| 
 | |
|         $mock->doSomething(); | |
|     } | |
| 
 | |
|     public function testStubbedWillThrowException() | |
|     { | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->any()) | |
|              ->method('doSomething') | |
|              ->willThrowException(new \Exception()); | |
| 
 | |
|         $this->expectException(\Exception::class); | |
| 
 | |
|         $mock->doSomething(); | |
|     } | |
| 
 | |
|     public function testStubbedReturnValue() | |
|     { | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->any()) | |
|              ->method('doSomething') | |
|              ->will($this->returnValue('something')); | |
| 
 | |
|         $this->assertEquals('something', $mock->doSomething()); | |
| 
 | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->any()) | |
|              ->method('doSomething') | |
|              ->willReturn('something'); | |
| 
 | |
|         $this->assertEquals('something', $mock->doSomething()); | |
|     } | |
| 
 | |
|     public function testStubbedReturnValueMap() | |
|     { | |
|         $map = [ | |
|             ['a', 'b', 'c', 'd'], | |
|             ['e', 'f', 'g', 'h'] | |
|         ]; | |
| 
 | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->any()) | |
|              ->method('doSomething') | |
|              ->will($this->returnValueMap($map)); | |
| 
 | |
|         $this->assertEquals('d', $mock->doSomething('a', 'b', 'c')); | |
|         $this->assertEquals('h', $mock->doSomething('e', 'f', 'g')); | |
|         $this->assertEquals(null, $mock->doSomething('foo', 'bar')); | |
| 
 | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->any()) | |
|              ->method('doSomething') | |
|              ->willReturnMap($map); | |
| 
 | |
|         $this->assertEquals('d', $mock->doSomething('a', 'b', 'c')); | |
|         $this->assertEquals('h', $mock->doSomething('e', 'f', 'g')); | |
|         $this->assertEquals(null, $mock->doSomething('foo', 'bar')); | |
|     } | |
| 
 | |
|     public function testStubbedReturnArgument() | |
|     { | |
|         $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->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->any()) | |
|              ->method('doSomething') | |
|              ->willReturnArgument(1); | |
| 
 | |
|         $this->assertEquals('b', $mock->doSomething('a', 'b')); | |
|     } | |
| 
 | |
|     public function testFunctionCallback() | |
|     { | |
|         $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->getMockBuilder(SomeClass::class) | |
|                      ->setMethods(['doSomething']) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->once()) | |
|              ->method('doSomething') | |
|              ->willReturnCallback('functionCallback'); | |
| 
 | |
|         $this->assertEquals('pass', $mock->doSomething('foo', 'bar')); | |
|     } | |
| 
 | |
|     public function testStubbedReturnSelf() | |
|     { | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->any()) | |
|              ->method('doSomething') | |
|              ->will($this->returnSelf()); | |
| 
 | |
|         $this->assertEquals($mock, $mock->doSomething()); | |
| 
 | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->any()) | |
|              ->method('doSomething') | |
|              ->willReturnSelf(); | |
| 
 | |
|         $this->assertEquals($mock, $mock->doSomething()); | |
|     } | |
| 
 | |
|     public function testStubbedReturnOnConsecutiveCalls() | |
|     { | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->any()) | |
|              ->method('doSomething') | |
|              ->will($this->onConsecutiveCalls('a', 'b', 'c')); | |
| 
 | |
|         $this->assertEquals('a', $mock->doSomething()); | |
|         $this->assertEquals('b', $mock->doSomething()); | |
|         $this->assertEquals('c', $mock->doSomething()); | |
| 
 | |
|         $mock = $this->getMockBuilder(AnInterface::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->any()) | |
|              ->method('doSomething') | |
|              ->willReturnOnConsecutiveCalls('a', 'b', 'c'); | |
| 
 | |
|         $this->assertEquals('a', $mock->doSomething()); | |
|         $this->assertEquals('b', $mock->doSomething()); | |
|         $this->assertEquals('c', $mock->doSomething()); | |
|     } | |
| 
 | |
|     public function testStaticMethodCallback() | |
|     { | |
|         $mock = $this->getMockBuilder(SomeClass::class) | |
|                      ->setMethods(['doSomething']) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->once()) | |
|              ->method('doSomething') | |
|              ->will($this->returnCallback(['MethodCallback', 'staticCallback'])); | |
| 
 | |
|         $this->assertEquals('pass', $mock->doSomething('foo', 'bar')); | |
|     } | |
| 
 | |
|     public function testPublicMethodCallback() | |
|     { | |
|         $mock = $this->getMockBuilder(SomeClass::class) | |
|                      ->setMethods(['doSomething']) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->once()) | |
|              ->method('doSomething') | |
|              ->will($this->returnCallback([new MethodCallback, 'nonStaticCallback'])); | |
| 
 | |
|         $this->assertEquals('pass', $mock->doSomething('foo', 'bar')); | |
|     } | |
| 
 | |
|     public function testMockClassOnlyGeneratedOnce() | |
|     { | |
|         $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->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)); | |
|         $this->assertNotEquals(get_class($mock1), get_class($mock4)); | |
|         $this->assertNotEquals(get_class($mock1), get_class($mock5)); | |
|         $this->assertEquals(get_class($mock2), get_class($mock3)); | |
|         $this->assertNotEquals(get_class($mock2), get_class($mock4)); | |
|         $this->assertNotEquals(get_class($mock2), get_class($mock5)); | |
|         $this->assertEquals(get_class($mock4), get_class($mock5)); | |
|     } | |
| 
 | |
|     public function testMockClassStoreOverrulable() | |
|     { | |
|         $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)); | |
|         $this->assertNotEquals(get_class($mock1), get_class($mock4)); | |
|         $this->assertNotEquals(get_class($mock2), get_class($mock3)); | |
|         $this->assertNotEquals(get_class($mock2), get_class($mock4)); | |
|         $this->assertNotEquals(get_class($mock2), get_class($mock5)); | |
|         $this->assertNotEquals(get_class($mock3), get_class($mock4)); | |
|         $this->assertNotEquals(get_class($mock3), get_class($mock5)); | |
|         $this->assertNotEquals(get_class($mock4), get_class($mock5)); | |
|     } | |
| 
 | |
|     public function testGetMockWithFixedClassNameCanProduceTheSameMockTwice() | |
|     { | |
|         $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->getMockBuilder(PartialMockTestClass::class) | |
|                       ->getMock(); | |
| 
 | |
|         $mock2 = $this->getMockBuilder(PartialMockTestClass::class) | |
|                       ->disableOriginalConstructor() | |
|                       ->getMock(); | |
| 
 | |
|         $this->assertTrue($mock1->constructorCalled); | |
|         $this->assertFalse($mock2->constructorCalled); | |
|     } | |
| 
 | |
|     public function testOriginalCloneSettingConsidered() | |
|     { | |
|         $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->getMockBuilder(AbstractMockTestClass::class) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->never()) | |
|              ->method('doSomething'); | |
|     } | |
| 
 | |
|     /** | |
|      * @dataProvider traversableProvider | |
|      */ | |
|     public function testGetMockForTraversable($type) | |
|     { | |
|         $mock = $this->getMockBuilder($type) | |
|                      ->getMock(); | |
| 
 | |
|         $this->assertInstanceOf(Traversable::class, $mock); | |
|     } | |
| 
 | |
|     public function testMultipleInterfacesCanBeMockedInSingleObject() | |
|     { | |
|         $mock = $this->getMockBuilder([AnInterface::class, AnotherInterface::class]) | |
|                      ->getMock(); | |
| 
 | |
|         $this->assertInstanceOf(AnInterface::class, $mock); | |
|         $this->assertInstanceOf(AnotherInterface::class, $mock); | |
|     } | |
| 
 | |
|     public function testGetMockForTrait() | |
|     { | |
|         $mock = $this->getMockForTrait(AbstractTrait::class); | |
| 
 | |
|         $mock->expects($this->never()) | |
|              ->method('doSomething'); | |
| 
 | |
|         $parent = get_parent_class($mock); | |
|         $traits = class_uses($parent, false); | |
| 
 | |
|         $this->assertContains(AbstractTrait::class, $traits); | |
|     } | |
| 
 | |
|     public function testClonedMockObjectShouldStillEqualTheOriginal() | |
|     { | |
|         $a = $this->getMockBuilder(stdClass::class) | |
|                   ->getMock(); | |
| 
 | |
|         $b = clone $a; | |
| 
 | |
|         $this->assertEquals($a, $b); | |
|     } | |
| 
 | |
|     public function testMockObjectsConstructedIndepentantlyShouldBeEqual() | |
|     { | |
|         $a = $this->getMockBuilder(stdClass::class) | |
|                   ->getMock(); | |
| 
 | |
|         $b = $this->getMockBuilder(stdClass::class) | |
|                   ->getMock(); | |
| 
 | |
|         $this->assertEquals($a, $b); | |
|     } | |
| 
 | |
|     public function testMockObjectsConstructedIndepentantlyShouldNotBeTheSame() | |
|     { | |
|         $a = $this->getMockBuilder(stdClass::class) | |
|                   ->getMock(); | |
| 
 | |
|         $b = $this->getMockBuilder(stdClass::class) | |
|                   ->getMock(); | |
| 
 | |
|         $this->assertNotSame($a, $b); | |
|     } | |
| 
 | |
|     public function testClonedMockObjectCanBeUsedInPlaceOfOriginalOne() | |
|     { | |
|         $x = $this->getMockBuilder(stdClass::class) | |
|                   ->getMock(); | |
| 
 | |
|         $y = clone $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->getMockBuilder(stdClass::class) | |
|                   ->getMock(); | |
| 
 | |
|         $y = clone $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; | |
| 
 | |
|         $mock = $this->getMockBuilder('SomeClass') | |
|                      ->setMethods(['doSomethingElse']) | |
|                      ->enableArgumentCloning() | |
|                      ->getMock(); | |
| 
 | |
|         $actualArguments = []; | |
| 
 | |
|         $mock->expects($this->any()) | |
|              ->method('doSomethingElse') | |
|              ->will( | |
|                  $this->returnCallback( | |
|                      function () use (&$actualArguments) { | |
|                          $actualArguments = func_get_args(); | |
|                      } | |
|                  ) | |
|              ); | |
| 
 | |
|         $mock->doSomethingElse($expectedObject); | |
| 
 | |
|         $this->assertEquals(1, count($actualArguments)); | |
|         $this->assertEquals($expectedObject, $actualArguments[0]); | |
|         $this->assertNotSame($expectedObject, $actualArguments[0]); | |
|     } | |
| 
 | |
|     public function testObjectMethodCallWithArgumentCloningDisabled() | |
|     { | |
|         $expectedObject = new stdClass; | |
| 
 | |
|         $mock = $this->getMockBuilder('SomeClass') | |
|                      ->setMethods(['doSomethingElse']) | |
|                      ->disableArgumentCloning() | |
|                      ->getMock(); | |
| 
 | |
|         $actualArguments = []; | |
| 
 | |
|         $mock->expects($this->any()) | |
|              ->method('doSomethingElse') | |
|              ->will( | |
|                  $this->returnCallback( | |
|                      function () use (&$actualArguments) { | |
|                          $actualArguments = func_get_args(); | |
|                      } | |
|                  ) | |
|              ); | |
| 
 | |
|         $mock->doSomethingElse($expectedObject); | |
| 
 | |
|         $this->assertEquals(1, count($actualArguments)); | |
|         $this->assertSame($expectedObject, $actualArguments[0]); | |
|     } | |
| 
 | |
|     public function testArgumentCloningOptionGeneratesUniqueMock() | |
|     { | |
|         $mockWithCloning = $this->getMockBuilder('SomeClass') | |
|                                 ->setMethods(['doSomethingElse']) | |
|                                 ->enableArgumentCloning() | |
|                                 ->getMock(); | |
| 
 | |
|         $mockWithoutCloning = $this->getMockBuilder('SomeClass') | |
|                                    ->setMethods(['doSomethingElse']) | |
|                                    ->disableArgumentCloning() | |
|                                    ->getMock(); | |
| 
 | |
|         $this->assertNotEquals($mockWithCloning, $mockWithoutCloning); | |
|     } | |
| 
 | |
|     public function testVerificationOfMethodNameFailsWithoutParameters() | |
|     { | |
|         $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 (ExpectationFailedException $e) { | |
|             $this->assertSame( | |
|                 '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() | |
|             ); | |
|         } | |
| 
 | |
|         $this->resetMockObjects(); | |
|     } | |
| 
 | |
|     public function testVerificationOfMethodNameFailsWithParameters() | |
|     { | |
|         $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 (ExpectationFailedException $e) { | |
|             $this->assertSame( | |
|                 '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() | |
|             ); | |
|         } | |
| 
 | |
|         $this->resetMockObjects(); | |
|     } | |
| 
 | |
|     public function testVerificationOfMethodNameFailsWithWrongParameters() | |
|     { | |
|         $mock = $this->getMockBuilder(SomeClass::class) | |
|                      ->setMethods(['right', 'wrong']) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->once()) | |
|              ->method('right') | |
|              ->with(['first', 'second']); | |
| 
 | |
|         try { | |
|             $mock->right(['second']); | |
|         } catch (ExpectationFailedException $e) { | |
|             $this->assertSame( | |
|                 '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(); | |
| 
 | |
| // CHECKOUT THIS MORE CAREFULLY | |
| //            $this->fail('Expected exception'); | |
|  | |
|         } catch (ExpectationFailedException $e) { | |
|             $this->assertSame( | |
|                 '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() | |
|             ); | |
|         } | |
| 
 | |
|         $this->resetMockObjects(); | |
|     } | |
| 
 | |
|     public function testVerificationOfNeverFailsWithEmptyParameters() | |
|     { | |
|         $mock = $this->getMockBuilder(SomeClass::class) | |
|                      ->setMethods(['right', 'wrong']) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->never()) | |
|              ->method('right') | |
|              ->with(); | |
| 
 | |
|         try { | |
|             $mock->right(); | |
|             $this->fail('Expected exception'); | |
|         } catch (ExpectationFailedException $e) { | |
|             $this->assertSame( | |
|                 'SomeClass::right() was not expected to be called.', | |
|                 $e->getMessage() | |
|             ); | |
|         } | |
| 
 | |
|         $this->resetMockObjects(); | |
|     } | |
| 
 | |
|     public function testVerificationOfNeverFailsWithAnyParameters() | |
|     { | |
|         $mock = $this->getMockBuilder(SomeClass::class) | |
|                      ->setMethods(['right', 'wrong']) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->never()) | |
|              ->method('right') | |
|              ->withAnyParameters(); | |
| 
 | |
|         try { | |
|             $mock->right(); | |
|             $this->fail('Expected exception'); | |
|         } catch (ExpectationFailedException $e) { | |
|             $this->assertSame( | |
|                 'SomeClass::right() was not expected to be called.', | |
|                 $e->getMessage() | |
|             ); | |
|         } | |
| 
 | |
|         $this->resetMockObjects(); | |
|     } | |
| 
 | |
|     public function testWithAnythingInsteadOfWithAnyParameters() | |
|     { | |
|         $mock = $this->getMockBuilder(SomeClass::class) | |
|                      ->setMethods(['right', 'wrong']) | |
|                      ->getMock(); | |
| 
 | |
|         $mock->expects($this->once()) | |
|              ->method('right') | |
|              ->with($this->anything()); | |
| 
 | |
|         try { | |
|             $mock->right(); | |
|             $this->fail('Expected exception'); | |
|         } catch (ExpectationFailedException $e) { | |
|             $this->assertSame( | |
|                 '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() | |
|             ); | |
|         } | |
| 
 | |
|         $this->resetMockObjects(); | |
|     } | |
| 
 | |
|     /** | |
|      * See https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81 | |
|      */ | |
|     public function testMockArgumentsPassedByReference() | |
|     { | |
|         $foo = $this->getMockBuilder('MethodCallbackByReference') | |
|                     ->setMethods(['bar']) | |
|                     ->disableOriginalConstructor() | |
|                     ->disableArgumentCloning() | |
|                     ->getMock(); | |
| 
 | |
|         $foo->expects($this->any()) | |
|             ->method('bar') | |
|             ->will($this->returnCallback([$foo, 'callback'])); | |
| 
 | |
|         $a = $b = $c = 0; | |
| 
 | |
|         $foo->bar($a, $b, $c); | |
| 
 | |
|         $this->assertEquals(1, $b); | |
|     } | |
| 
 | |
|     /** | |
|      * See https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81 | |
|      */ | |
|     public function testMockArgumentsPassedByReference2() | |
|     { | |
|         $foo = $this->getMockBuilder('MethodCallbackByReference') | |
|                     ->disableOriginalConstructor() | |
|                     ->disableArgumentCloning() | |
|                     ->getMock(); | |
| 
 | |
|         $foo->expects($this->any()) | |
|             ->method('bar') | |
|             ->will($this->returnCallback( | |
|                 function (&$a, &$b, $c) { | |
|                     $b = 1; | |
|                 } | |
|             )); | |
| 
 | |
|         $a = $b = $c = 0; | |
| 
 | |
|         $foo->bar($a, $b, $c); | |
| 
 | |
|         $this->assertEquals(1, $b); | |
|     } | |
| 
 | |
|     /** | |
|      * @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/116 | |
|      */ | |
|     public function testMockArgumentsPassedByReference3() | |
|     { | |
|         $foo = $this->getMockBuilder('MethodCallbackByReference') | |
|                     ->setMethods(['bar']) | |
|                     ->disableOriginalConstructor() | |
|                     ->disableArgumentCloning() | |
|                     ->getMock(); | |
| 
 | |
|         $a = new stdClass; | |
|         $b = $c = 0; | |
| 
 | |
|         $foo->expects($this->any()) | |
|             ->method('bar') | |
|             ->with($a, $b, $c) | |
|             ->will($this->returnCallback([$foo, 'callback'])); | |
| 
 | |
|         $this->assertNull($foo->bar($a, $b, $c)); | |
|     } | |
| 
 | |
|     /** | |
|      * @see https://github.com/sebastianbergmann/phpunit/issues/796 | |
|      */ | |
|     public function testMockArgumentsPassedByReference4() | |
|     { | |
|         $foo = $this->getMockBuilder('MethodCallbackByReference') | |
|                     ->setMethods(['bar']) | |
|                     ->disableOriginalConstructor() | |
|                     ->disableArgumentCloning() | |
|                     ->getMock(); | |
| 
 | |
|         $a = new stdClass; | |
|         $b = $c = 0; | |
| 
 | |
|         $foo->expects($this->any()) | |
|             ->method('bar') | |
|             ->with($this->isInstanceOf(stdClass::class), $b, $c) | |
|             ->will($this->returnCallback([$foo, 'callback'])); | |
| 
 | |
|         $this->assertNull($foo->bar($a, $b, $c)); | |
|     } | |
| 
 | |
|     /** | |
|      * @requires extension soap | |
|      */ | |
|     public function testCreateMockFromWsdl() | |
|     { | |
|         $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl', 'WsdlMock'); | |
| 
 | |
|         $this->assertStringStartsWith( | |
|             'Mock_WsdlMock_', | |
|             get_class($mock) | |
|         ); | |
|     } | |
| 
 | |
|     /** | |
|      * @requires extension soap | |
|      */ | |
|     public function testCreateNamespacedMockFromWsdl() | |
|     { | |
|         $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl', 'My\\Space\\WsdlMock'); | |
| 
 | |
|         $this->assertStringStartsWith( | |
|             'Mock_WsdlMock_', | |
|             get_class($mock) | |
|         ); | |
|     } | |
| 
 | |
|     /** | |
|      * @requires extension soap | |
|      */ | |
|     public function testCreateTwoMocksOfOneWsdlFile() | |
|     { | |
|         $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)); | |
|     } | |
| 
 | |
|     /** | |
|      * @requires extension soap | |
|      */ | |
|     public function testCreateMockOfWsdlFileWithSpecialChars() | |
|     { | |
|         $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/Go ogle-Sea.rch.wsdl'); | |
| 
 | |
|         $this->assertStringStartsWith('Mock_GoogleSearch_', get_class($mock)); | |
|     } | |
| 
 | |
|     /** | |
|      * @see    https://github.com/sebastianbergmann/phpunit-mock-objects/issues/156 | |
|      * @ticket 156 | |
|      */ | |
|     public function testInterfaceWithStaticMethodCanBeStubbed() | |
|     { | |
|         $this->assertInstanceOf( | |
|             InterfaceWithStaticMethod::class, | |
|             $this->getMockBuilder(InterfaceWithStaticMethod::class)->getMock() | |
|         ); | |
|     } | |
| 
 | |
|     public function testInvokingStubbedStaticMethodRaisesException() | |
|     { | |
|         $mock = $this->getMockBuilder(ClassWithStaticMethod::class)->getMock(); | |
| 
 | |
|         $this->expectException(\PHPUnit\Framework\MockObject\BadMethodCallException::class); | |
| 
 | |
|         $mock->staticMethod(); | |
|     } | |
| 
 | |
|     /** | |
|      * @see    https://github.com/sebastianbergmann/phpunit-mock-objects/issues/171 | |
|      * @ticket 171 | |
|      */ | |
|     public function testStubForClassThatImplementsSerializableCanBeCreatedWithoutInvokingTheConstructor() | |
|     { | |
|         $this->assertInstanceOf( | |
|             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, []); | |
|     } | |
| 
 | |
|     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()); | |
|     } | |
| }
 | |
| 
 |