201 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * @covers PHPUnit_Framework_MockObject_Generator
 | 
						|
 *
 | 
						|
 * @uses PHPUnit_Framework_MockObject_InvocationMocker
 | 
						|
 * @uses PHPUnit_Framework_MockObject_Builder_InvocationMocker
 | 
						|
 * @uses PHPUnit_Framework_MockObject_Invocation_Object
 | 
						|
 * @uses PHPUnit_Framework_MockObject_Invocation_Static
 | 
						|
 * @uses PHPUnit_Framework_MockObject_Matcher
 | 
						|
 * @uses PHPUnit_Framework_MockObject_Matcher_InvokedRecorder
 | 
						|
 * @uses PHPUnit_Framework_MockObject_Matcher_MethodName
 | 
						|
 * @uses PHPUnit_Framework_MockObject_Stub_Return
 | 
						|
 * @uses PHPUnit_Framework_MockObject_Matcher_InvokedCount
 | 
						|
 */
 | 
						|
class Framework_MockObject_GeneratorTest extends PHPUnit_Framework_TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var PHPUnit_Framework_MockObject_Generator
 | 
						|
     */
 | 
						|
    private $generator;
 | 
						|
 | 
						|
    protected function setUp()
 | 
						|
    {
 | 
						|
        $this->generator = new PHPUnit_Framework_MockObject_Generator;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @expectedException PHPUnit_Framework_MockObject_RuntimeException
 | 
						|
     */
 | 
						|
    public function testGetMockFailsWhenInvalidFunctionNameIsPassedInAsAFunctionToMock()
 | 
						|
    {
 | 
						|
        $this->generator->getMock(stdClass::class, [0]);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testGetMockCanCreateNonExistingFunctions()
 | 
						|
    {
 | 
						|
        $mock = $this->generator->getMock(stdClass::class, ['testFunction']);
 | 
						|
 | 
						|
        $this->assertTrue(method_exists($mock, 'testFunction'));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @expectedException PHPUnit_Framework_MockObject_RuntimeException
 | 
						|
     * @expectedExceptionMessage duplicates: "foo, bar, foo" (duplicate: "foo")
 | 
						|
     */
 | 
						|
    public function testGetMockGeneratorFails()
 | 
						|
    {
 | 
						|
        $this->generator->getMock(stdClass::class, ['foo', 'bar', 'foo']);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @requires PHP 7
 | 
						|
     */
 | 
						|
    public function testGetMockBlacklistedMethodNamesPhp7()
 | 
						|
    {
 | 
						|
        $mock = $this->generator->getMock(InterfaceWithSemiReservedMethodName::class);
 | 
						|
 | 
						|
        $this->assertTrue(method_exists($mock, 'unset'));
 | 
						|
        $this->assertInstanceOf(InterfaceWithSemiReservedMethodName::class, $mock);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testGetMockForAbstractClassDoesNotFailWhenFakingInterfaces()
 | 
						|
    {
 | 
						|
        $mock = $this->generator->getMockForAbstractClass(Countable::class);
 | 
						|
 | 
						|
        $this->assertTrue(method_exists($mock, 'count'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testGetMockForAbstractClassStubbingAbstractClass()
 | 
						|
    {
 | 
						|
        $mock = $this->generator->getMockForAbstractClass(AbstractMockTestClass::class);
 | 
						|
 | 
						|
        $this->assertTrue(method_exists($mock, 'doSomething'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testGetMockForAbstractClassWithNonExistentMethods()
 | 
						|
    {
 | 
						|
        $mock = $this->generator->getMockForAbstractClass(
 | 
						|
            AbstractMockTestClass::class,
 | 
						|
            [],
 | 
						|
            '',
 | 
						|
            true,
 | 
						|
            true,
 | 
						|
            true,
 | 
						|
            ['nonexistentMethod']
 | 
						|
        );
 | 
						|
 | 
						|
        $this->assertTrue(method_exists($mock, 'nonexistentMethod'));
 | 
						|
        $this->assertTrue(method_exists($mock, 'doSomething'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testGetMockForAbstractClassShouldCreateStubsOnlyForAbstractMethodWhenNoMethodsWereInformed()
 | 
						|
    {
 | 
						|
        $mock = $this->generator->getMockForAbstractClass(AbstractMockTestClass::class);
 | 
						|
 | 
						|
        $mock->expects($this->any())
 | 
						|
             ->method('doSomething')
 | 
						|
             ->willReturn('testing');
 | 
						|
 | 
						|
        $this->assertEquals('testing', $mock->doSomething());
 | 
						|
        $this->assertEquals(1, $mock->returnAnything());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @dataProvider getMockForAbstractClassExpectsInvalidArgumentExceptionDataprovider
 | 
						|
     * @expectedException PHPUnit_Framework_Exception
 | 
						|
     */
 | 
						|
    public function testGetMockForAbstractClassExpectingInvalidArgumentException($className, $mockClassName)
 | 
						|
    {
 | 
						|
        $this->generator->getMockForAbstractClass($className, [], $mockClassName);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @expectedException PHPUnit_Framework_MockObject_RuntimeException
 | 
						|
     */
 | 
						|
    public function testGetMockForAbstractClassAbstractClassDoesNotExist()
 | 
						|
    {
 | 
						|
        $this->generator->getMockForAbstractClass('Tux');
 | 
						|
    }
 | 
						|
 | 
						|
    public function getMockForAbstractClassExpectsInvalidArgumentExceptionDataprovider()
 | 
						|
    {
 | 
						|
        return [
 | 
						|
            'className not a string'     => [[], ''],
 | 
						|
            'mockClassName not a string' => [Countable::class, new stdClass],
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    public function testGetMockForTraitWithNonExistentMethodsAndNonAbstractMethods()
 | 
						|
    {
 | 
						|
        $mock = $this->generator->getMockForTrait(
 | 
						|
            AbstractTrait::class,
 | 
						|
            [],
 | 
						|
            '',
 | 
						|
            true,
 | 
						|
            true,
 | 
						|
            true,
 | 
						|
            ['nonexistentMethod']
 | 
						|
        );
 | 
						|
 | 
						|
        $this->assertTrue(method_exists($mock, 'nonexistentMethod'));
 | 
						|
        $this->assertTrue(method_exists($mock, 'doSomething'));
 | 
						|
        $this->assertTrue($mock->mockableMethod());
 | 
						|
        $this->assertTrue($mock->anotherMockableMethod());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testGetMockForTraitStubbingAbstractMethod()
 | 
						|
    {
 | 
						|
        $mock = $this->generator->getMockForTrait(AbstractTrait::class);
 | 
						|
 | 
						|
        $this->assertTrue(method_exists($mock, 'doSomething'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testGetMockForSingletonWithReflectionSuccess()
 | 
						|
    {
 | 
						|
        $mock = $this->generator->getMock(SingletonClass::class, ['doSomething'], [], '', false);
 | 
						|
 | 
						|
        $this->assertInstanceOf('SingletonClass', $mock);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @expectedException PHPUnit_Framework_MockObject_RuntimeException
 | 
						|
     */
 | 
						|
    public function testExceptionIsRaisedForMutuallyExclusiveOptions()
 | 
						|
    {
 | 
						|
        $this->generator->getMock(stdClass::class, [], [], '', false, true, true, true, true);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @requires PHP 7
 | 
						|
     */
 | 
						|
    public function testCanImplementInterfacesThatHaveMethodsWithReturnTypes()
 | 
						|
    {
 | 
						|
        $stub = $this->generator->getMock([AnInterfaceWithReturnType::class, AnInterface::class]);
 | 
						|
 | 
						|
        $this->assertInstanceOf(AnInterfaceWithReturnType::class, $stub);
 | 
						|
        $this->assertInstanceOf(AnInterface::class, $stub);
 | 
						|
        $this->assertInstanceOf(PHPUnit_Framework_MockObject_MockObject::class, $stub);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCanConfigureMethodsForDoubleOfNonExistentClass()
 | 
						|
    {
 | 
						|
        $className = 'X' . md5(microtime());
 | 
						|
 | 
						|
        $mock = $this->generator->getMock($className, ['someMethod']);
 | 
						|
 | 
						|
        $this->assertInstanceOf($className, $mock);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCanInvokeMethodsOfNonExistentClass()
 | 
						|
    {
 | 
						|
        $className = 'X' . md5(microtime());
 | 
						|
 | 
						|
        $mock = $this->generator->getMock($className, ['someMethod']);
 | 
						|
 | 
						|
        $mock->expects($this->once())->method('someMethod');
 | 
						|
 | 
						|
        $this->assertNull($mock->someMethod());
 | 
						|
    }
 | 
						|
}
 |