nginxsonarrradarrplexorganizrdashboardbookmarkapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbget
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.
210 lines
6.6 KiB
210 lines
6.6 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\Generator;
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* @covers \PHPUnit\Framework\MockObject\Generator
|
|
*
|
|
* @uses \PHPUnit\Framework\MockObject\InvocationMocker
|
|
* @uses \PHPUnit\Framework\MockObject\Builder\InvocationMocker
|
|
* @uses \PHPUnit\Framework\MockObject\Invocation\ObjectInvocation
|
|
* @uses \PHPUnit\Framework\MockObject\Invocation\StaticInvocation
|
|
* @uses \PHPUnit\Framework\MockObject\Matcher
|
|
* @uses \PHPUnit\Framework\MockObject\Matcher\InvokedRecorder
|
|
* @uses \PHPUnit\Framework\MockObject\Matcher\MethodName
|
|
* @uses \PHPUnit\Framework\MockObject\Stub\ReturnStub
|
|
* @uses \PHPUnit\Framework\MockObject\Matcher\InvokedCount
|
|
*/
|
|
class GeneratorTest extends TestCase
|
|
{
|
|
/**
|
|
* @var Generator
|
|
*/
|
|
private $generator;
|
|
|
|
protected function setUp()
|
|
{
|
|
$this->generator = new Generator;
|
|
}
|
|
|
|
public function testGetMockFailsWhenInvalidFunctionNameIsPassedInAsAFunctionToMock()
|
|
{
|
|
$this->expectException(\PHPUnit\Framework\MockObject\RuntimeException::class);
|
|
|
|
$this->generator->getMock(stdClass::class, [0]);
|
|
}
|
|
|
|
public function testGetMockCanCreateNonExistingFunctions()
|
|
{
|
|
$mock = $this->generator->getMock(stdClass::class, ['testFunction']);
|
|
|
|
$this->assertTrue(method_exists($mock, 'testFunction'));
|
|
}
|
|
|
|
public function testGetMockGeneratorFails()
|
|
{
|
|
$this->expectException(\PHPUnit\Framework\MockObject\RuntimeException::class);
|
|
$this->expectExceptionMessage('duplicates: "foo, bar, foo" (duplicate: "foo")');
|
|
|
|
$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
|
|
*/
|
|
public function testGetMockForAbstractClassExpectingInvalidArgumentException($className, $mockClassName)
|
|
{
|
|
$this->expectException(PHPUnit\Framework\Exception::class);
|
|
|
|
$this->generator->getMockForAbstractClass($className, [], $mockClassName);
|
|
}
|
|
|
|
public function testGetMockForAbstractClassAbstractClassDoesNotExist()
|
|
{
|
|
$this->expectException(\PHPUnit\Framework\MockObject\RuntimeException::class);
|
|
|
|
$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);
|
|
}
|
|
|
|
public function testExceptionIsRaisedForMutuallyExclusiveOptions()
|
|
{
|
|
$this->expectException(\PHPUnit\Framework\MockObject\RuntimeException::class);
|
|
|
|
$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(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());
|
|
}
|
|
}
|
|
|