Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: /** Chris@0: * Chris@0: * Chris@0: * @since Class available since Release 3.0.0 Chris@0: */ Chris@0: class Framework_MockObjectTest extends PHPUnit_Framework_TestCase Chris@0: { Chris@0: public function testMockedMethodIsNeverCalled() Chris@0: { Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->never()) Chris@0: ->method('doSomething'); Chris@0: } Chris@0: Chris@0: public function testMockedMethodIsNeverCalledWithParameter() Chris@0: { Chris@0: $mock = $this->getMock('SomeClass'); Chris@0: $mock->expects($this->never()) Chris@0: ->method('doSomething') Chris@0: ->with('someArg'); Chris@0: } Chris@0: Chris@0: public function testMockedMethodIsNotCalledWhenExpectsAnyWithParameter() Chris@0: { Chris@0: $mock = $this->getMock('SomeClass'); Chris@0: $mock->expects($this->any()) Chris@0: ->method('doSomethingElse') Chris@0: ->with('someArg'); Chris@0: } Chris@0: Chris@0: public function testMockedMethodIsNotCalledWhenMethodSpecifiedDirectlyWithParameter() Chris@0: { Chris@0: $mock = $this->getMock('SomeClass'); Chris@0: $mock->method('doSomethingElse') Chris@0: ->with('someArg'); Chris@0: } Chris@0: Chris@0: public function testMockedMethodIsCalledAtLeastOnce() Chris@0: { Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->atLeastOnce()) Chris@0: ->method('doSomething'); Chris@0: Chris@0: $mock->doSomething(); Chris@0: } Chris@0: Chris@0: public function testMockedMethodIsCalledAtLeastOnce2() Chris@0: { Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->atLeastOnce()) Chris@0: ->method('doSomething'); Chris@0: Chris@0: $mock->doSomething(); Chris@0: $mock->doSomething(); Chris@0: } Chris@0: Chris@0: public function testMockedMethodIsCalledAtLeastTwice() Chris@0: { Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->atLeast(2)) Chris@0: ->method('doSomething'); Chris@0: Chris@0: $mock->doSomething(); Chris@0: $mock->doSomething(); Chris@0: } Chris@0: Chris@0: public function testMockedMethodIsCalledAtLeastTwice2() Chris@0: { Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->atLeast(2)) Chris@0: ->method('doSomething'); Chris@0: Chris@0: $mock->doSomething(); Chris@0: $mock->doSomething(); Chris@0: $mock->doSomething(); Chris@0: } Chris@0: Chris@0: public function testMockedMethodIsCalledAtMostTwice() Chris@0: { Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->atMost(2)) Chris@0: ->method('doSomething'); Chris@0: Chris@0: $mock->doSomething(); Chris@0: $mock->doSomething(); Chris@0: } Chris@0: Chris@0: public function testMockedMethodIsCalledAtMosttTwice2() Chris@0: { Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->atMost(2)) Chris@0: ->method('doSomething'); Chris@0: Chris@0: $mock->doSomething(); Chris@0: } Chris@0: Chris@0: public function testMockedMethodIsCalledOnce() Chris@0: { Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->once()) Chris@0: ->method('doSomething'); Chris@0: Chris@0: $mock->doSomething(); Chris@0: } Chris@0: Chris@0: public function testMockedMethodIsCalledOnceWithParameter() Chris@0: { Chris@0: $mock = $this->getMock('SomeClass'); Chris@0: $mock->expects($this->once()) Chris@0: ->method('doSomethingElse') Chris@0: ->with($this->equalTo('something')); Chris@0: Chris@0: $mock->doSomethingElse('something'); Chris@0: } Chris@0: Chris@0: public function testMockedMethodIsCalledExactly() Chris@0: { Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->exactly(2)) Chris@0: ->method('doSomething'); Chris@0: Chris@0: $mock->doSomething(); Chris@0: $mock->doSomething(); Chris@0: } Chris@0: Chris@0: public function testStubbedException() Chris@0: { Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->any()) Chris@0: ->method('doSomething') Chris@0: ->will($this->throwException(new Exception)); Chris@0: Chris@0: try { Chris@0: $mock->doSomething(); Chris@0: } catch (Exception $e) { Chris@0: return; Chris@0: } Chris@0: Chris@0: $this->fail(); Chris@0: } Chris@0: Chris@0: public function testStubbedWillThrowException() Chris@0: { Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->any()) Chris@0: ->method('doSomething') Chris@0: ->willThrowException(new Exception); Chris@0: Chris@0: try { Chris@0: $mock->doSomething(); Chris@0: } catch (Exception $e) { Chris@0: return; Chris@0: } Chris@0: Chris@0: $this->fail(); Chris@0: } Chris@0: Chris@0: public function testStubbedReturnValue() Chris@0: { Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->any()) Chris@0: ->method('doSomething') Chris@0: ->will($this->returnValue('something')); Chris@0: Chris@0: $this->assertEquals('something', $mock->doSomething()); Chris@0: Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->any()) Chris@0: ->method('doSomething') Chris@0: ->willReturn('something'); Chris@0: Chris@0: $this->assertEquals('something', $mock->doSomething()); Chris@0: } Chris@0: Chris@0: public function testStubbedReturnValueMap() Chris@0: { Chris@0: $map = array( Chris@0: array('a', 'b', 'c', 'd'), Chris@0: array('e', 'f', 'g', 'h') Chris@0: ); Chris@0: Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->any()) Chris@0: ->method('doSomething') Chris@0: ->will($this->returnValueMap($map)); Chris@0: Chris@0: $this->assertEquals('d', $mock->doSomething('a', 'b', 'c')); Chris@0: $this->assertEquals('h', $mock->doSomething('e', 'f', 'g')); Chris@0: $this->assertEquals(null, $mock->doSomething('foo', 'bar')); Chris@0: Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->any()) Chris@0: ->method('doSomething') Chris@0: ->willReturnMap($map); Chris@0: Chris@0: $this->assertEquals('d', $mock->doSomething('a', 'b', 'c')); Chris@0: $this->assertEquals('h', $mock->doSomething('e', 'f', 'g')); Chris@0: $this->assertEquals(null, $mock->doSomething('foo', 'bar')); Chris@0: } Chris@0: Chris@0: public function testStubbedReturnArgument() Chris@0: { Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->any()) Chris@0: ->method('doSomething') Chris@0: ->will($this->returnArgument(1)); Chris@0: Chris@0: $this->assertEquals('b', $mock->doSomething('a', 'b')); Chris@0: Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->any()) Chris@0: ->method('doSomething') Chris@0: ->willReturnArgument(1); Chris@0: Chris@0: $this->assertEquals('b', $mock->doSomething('a', 'b')); Chris@0: } Chris@0: Chris@0: public function testFunctionCallback() Chris@0: { Chris@0: $mock = $this->getMock('SomeClass', array('doSomething'), array(), '', false); Chris@0: $mock->expects($this->once()) Chris@0: ->method('doSomething') Chris@0: ->will($this->returnCallback('functionCallback')); Chris@0: Chris@0: $this->assertEquals('pass', $mock->doSomething('foo', 'bar')); Chris@0: Chris@0: $mock = $this->getMock('SomeClass', array('doSomething'), array(), '', false); Chris@0: $mock->expects($this->once()) Chris@0: ->method('doSomething') Chris@0: ->willReturnCallback('functionCallback'); Chris@0: Chris@0: $this->assertEquals('pass', $mock->doSomething('foo', 'bar')); Chris@0: } Chris@0: Chris@0: public function testStubbedReturnSelf() Chris@0: { Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->any()) Chris@0: ->method('doSomething') Chris@0: ->will($this->returnSelf()); Chris@0: Chris@0: $this->assertEquals($mock, $mock->doSomething()); Chris@0: Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->any()) Chris@0: ->method('doSomething') Chris@0: ->willReturnSelf(); Chris@0: Chris@0: $this->assertEquals($mock, $mock->doSomething()); Chris@0: } Chris@0: Chris@0: public function testStubbedReturnOnConsecutiveCalls() Chris@0: { Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->any()) Chris@0: ->method('doSomething') Chris@0: ->will($this->onConsecutiveCalls('a', 'b', 'c')); Chris@0: Chris@0: $this->assertEquals('a', $mock->doSomething()); Chris@0: $this->assertEquals('b', $mock->doSomething()); Chris@0: $this->assertEquals('c', $mock->doSomething()); Chris@0: Chris@0: $mock = $this->getMock('AnInterface'); Chris@0: $mock->expects($this->any()) Chris@0: ->method('doSomething') Chris@0: ->willReturnOnConsecutiveCalls('a', 'b', 'c'); Chris@0: Chris@0: $this->assertEquals('a', $mock->doSomething()); Chris@0: $this->assertEquals('b', $mock->doSomething()); Chris@0: $this->assertEquals('c', $mock->doSomething()); Chris@0: } Chris@0: Chris@0: public function testStaticMethodCallback() Chris@0: { Chris@0: $mock = $this->getMock('SomeClass', array('doSomething'), array(), '', false); Chris@0: $mock->expects($this->once()) Chris@0: ->method('doSomething') Chris@0: ->will($this->returnCallback(array('MethodCallback', 'staticCallback'))); Chris@0: Chris@0: $this->assertEquals('pass', $mock->doSomething('foo', 'bar')); Chris@0: } Chris@0: Chris@0: public function testPublicMethodCallback() Chris@0: { Chris@0: $mock = $this->getMock('SomeClass', array('doSomething'), array(), '', false); Chris@0: $mock->expects($this->once()) Chris@0: ->method('doSomething') Chris@0: ->will($this->returnCallback(array(new MethodCallback, 'nonStaticCallback'))); Chris@0: Chris@0: $this->assertEquals('pass', $mock->doSomething('foo', 'bar')); Chris@0: } Chris@0: Chris@0: public function testMockClassOnlyGeneratedOnce() Chris@0: { Chris@0: $mock1 = $this->getMock('AnInterface'); Chris@0: $mock2 = $this->getMock('AnInterface'); Chris@0: Chris@0: $this->assertEquals(get_class($mock1), get_class($mock2)); Chris@0: } Chris@0: Chris@0: public function testMockClassDifferentForPartialMocks() Chris@0: { Chris@0: $mock1 = $this->getMock('PartialMockTestClass'); Chris@0: $mock2 = $this->getMock('PartialMockTestClass', array('doSomething')); Chris@0: $mock3 = $this->getMock('PartialMockTestClass', array('doSomething')); Chris@0: $mock4 = $this->getMock('PartialMockTestClass', array('doAnotherThing')); Chris@0: $mock5 = $this->getMock('PartialMockTestClass', array('doAnotherThing')); Chris@0: Chris@0: $this->assertNotEquals(get_class($mock1), get_class($mock2)); Chris@0: $this->assertNotEquals(get_class($mock1), get_class($mock3)); Chris@0: $this->assertNotEquals(get_class($mock1), get_class($mock4)); Chris@0: $this->assertNotEquals(get_class($mock1), get_class($mock5)); Chris@0: $this->assertEquals(get_class($mock2), get_class($mock3)); Chris@0: $this->assertNotEquals(get_class($mock2), get_class($mock4)); Chris@0: $this->assertNotEquals(get_class($mock2), get_class($mock5)); Chris@0: $this->assertEquals(get_class($mock4), get_class($mock5)); Chris@0: } Chris@0: Chris@0: public function testMockClassStoreOverrulable() Chris@0: { Chris@0: $mock1 = $this->getMock('PartialMockTestClass'); Chris@0: $mock2 = $this->getMock('PartialMockTestClass', array(), array(), 'MyMockClassNameForPartialMockTestClass1'); Chris@0: $mock3 = $this->getMock('PartialMockTestClass'); Chris@0: $mock4 = $this->getMock('PartialMockTestClass', array('doSomething'), array(), 'AnotherMockClassNameForPartialMockTestClass'); Chris@0: $mock5 = $this->getMock('PartialMockTestClass', array(), array(), 'MyMockClassNameForPartialMockTestClass2'); Chris@0: Chris@0: $this->assertNotEquals(get_class($mock1), get_class($mock2)); Chris@0: $this->assertEquals(get_class($mock1), get_class($mock3)); Chris@0: $this->assertNotEquals(get_class($mock1), get_class($mock4)); Chris@0: $this->assertNotEquals(get_class($mock2), get_class($mock3)); Chris@0: $this->assertNotEquals(get_class($mock2), get_class($mock4)); Chris@0: $this->assertNotEquals(get_class($mock2), get_class($mock5)); Chris@0: $this->assertNotEquals(get_class($mock3), get_class($mock4)); Chris@0: $this->assertNotEquals(get_class($mock3), get_class($mock5)); Chris@0: $this->assertNotEquals(get_class($mock4), get_class($mock5)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @covers PHPUnit_Framework_MockObject_Generator::getMock Chris@0: */ Chris@0: public function testGetMockWithFixedClassNameCanProduceTheSameMockTwice() Chris@0: { Chris@0: $mock = $this->getMockBuilder('StdClass')->setMockClassName('FixedName')->getMock(); Chris@0: $mock = $this->getMockBuilder('StdClass')->setMockClassName('FixedName')->getMock(); Chris@0: $this->assertInstanceOf('StdClass', $mock); Chris@0: } Chris@0: Chris@0: public function testOriginalConstructorSettingConsidered() Chris@0: { Chris@0: $mock1 = $this->getMock('PartialMockTestClass'); Chris@0: $mock2 = $this->getMock('PartialMockTestClass', array(), array(), '', false); Chris@0: Chris@0: $this->assertTrue($mock1->constructorCalled); Chris@0: $this->assertFalse($mock2->constructorCalled); Chris@0: } Chris@0: Chris@0: public function testOriginalCloneSettingConsidered() Chris@0: { Chris@0: $mock1 = $this->getMock('PartialMockTestClass'); Chris@0: $mock2 = $this->getMock('PartialMockTestClass', array(), array(), '', true, false); Chris@0: Chris@0: $this->assertNotEquals(get_class($mock1), get_class($mock2)); Chris@0: } Chris@0: Chris@0: public function testGetMockForAbstractClass() Chris@0: { Chris@0: $mock = $this->getMock('AbstractMockTestClass'); Chris@0: $mock->expects($this->never()) Chris@0: ->method('doSomething'); Chris@0: } Chris@0: Chris@0: public function traversableProvider() Chris@0: { Chris@0: return array( Chris@0: array('Traversable'), Chris@0: array('\Traversable'), Chris@0: array('TraversableMockTestInterface'), Chris@0: array(array('Traversable')), Chris@0: array(array('Iterator','Traversable')), Chris@0: array(array('\Iterator','\Traversable')) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @dataProvider traversableProvider Chris@0: */ Chris@0: public function testGetMockForTraversable($type) Chris@0: { Chris@0: $mock = $this->getMock($type); Chris@0: $this->assertInstanceOf('Traversable', $mock); Chris@0: } Chris@0: Chris@0: public function testMultipleInterfacesCanBeMockedInSingleObject() Chris@0: { Chris@0: $mock = $this->getMock(array('AnInterface', 'AnotherInterface')); Chris@0: $this->assertInstanceOf('AnInterface', $mock); Chris@0: $this->assertInstanceOf('AnotherInterface', $mock); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @requires PHP 5.4.0 Chris@0: */ Chris@0: public function testGetMockForTrait() Chris@0: { Chris@0: $mock = $this->getMockForTrait('AbstractTrait'); Chris@0: $mock->expects($this->never())->method('doSomething'); Chris@0: Chris@0: $parent = get_parent_class($mock); Chris@0: $traits = class_uses($parent, false); Chris@0: Chris@0: $this->assertContains('AbstractTrait', $traits); Chris@0: } Chris@0: Chris@0: public function testClonedMockObjectShouldStillEqualTheOriginal() Chris@0: { Chris@0: $a = $this->getMock('stdClass'); Chris@0: $b = clone $a; Chris@0: $this->assertEquals($a, $b); Chris@0: } Chris@0: Chris@0: public function testMockObjectsConstructedIndepentantlyShouldBeEqual() Chris@0: { Chris@0: $a = $this->getMock('stdClass'); Chris@0: $b = $this->getMock('stdClass'); Chris@0: $this->assertEquals($a, $b); Chris@0: } Chris@0: Chris@0: public function testMockObjectsConstructedIndepentantlyShouldNotBeTheSame() Chris@0: { Chris@0: $a = $this->getMock('stdClass'); Chris@0: $b = $this->getMock('stdClass'); Chris@0: $this->assertNotSame($a, $b); Chris@0: } Chris@0: Chris@0: public function testClonedMockObjectCanBeUsedInPlaceOfOriginalOne() Chris@0: { Chris@0: $x = $this->getMock('stdClass'); Chris@0: $y = clone $x; Chris@0: Chris@0: $mock = $this->getMock('stdClass', array('foo')); Chris@0: $mock->expects($this->once())->method('foo')->with($this->equalTo($x)); Chris@0: $mock->foo($y); Chris@0: } Chris@0: Chris@0: public function testClonedMockObjectIsNotIdenticalToOriginalOne() Chris@0: { Chris@0: $x = $this->getMock('stdClass'); Chris@0: $y = clone $x; Chris@0: Chris@0: $mock = $this->getMock('stdClass', array('foo')); Chris@0: $mock->expects($this->once())->method('foo')->with($this->logicalNot($this->identicalTo($x))); Chris@0: $mock->foo($y); Chris@0: } Chris@0: Chris@0: public function testObjectMethodCallWithArgumentCloningEnabled() Chris@0: { Chris@0: $expectedObject = new StdClass; Chris@0: Chris@0: $mock = $this->getMockBuilder('SomeClass') Chris@0: ->setMethods(array('doSomethingElse')) Chris@0: ->enableArgumentCloning() Chris@0: ->getMock(); Chris@0: Chris@0: $actualArguments = array(); Chris@0: Chris@0: $mock->expects($this->any()) Chris@0: ->method('doSomethingElse') Chris@0: ->will($this->returnCallback(function () use (&$actualArguments) { Chris@0: $actualArguments = func_get_args(); Chris@0: })); Chris@0: Chris@0: $mock->doSomethingElse($expectedObject); Chris@0: Chris@0: $this->assertEquals(1, count($actualArguments)); Chris@0: $this->assertEquals($expectedObject, $actualArguments[0]); Chris@0: $this->assertNotSame($expectedObject, $actualArguments[0]); Chris@0: } Chris@0: Chris@0: public function testObjectMethodCallWithArgumentCloningDisabled() Chris@0: { Chris@0: $expectedObject = new StdClass; Chris@0: Chris@0: $mock = $this->getMockBuilder('SomeClass') Chris@0: ->setMethods(array('doSomethingElse')) Chris@0: ->disableArgumentCloning() Chris@0: ->getMock(); Chris@0: Chris@0: $actualArguments = array(); Chris@0: Chris@0: $mock->expects($this->any()) Chris@0: ->method('doSomethingElse') Chris@0: ->will($this->returnCallback(function () use (&$actualArguments) { Chris@0: $actualArguments = func_get_args(); Chris@0: })); Chris@0: Chris@0: $mock->doSomethingElse($expectedObject); Chris@0: Chris@0: $this->assertEquals(1, count($actualArguments)); Chris@0: $this->assertSame($expectedObject, $actualArguments[0]); Chris@0: } Chris@0: Chris@0: public function testArgumentCloningOptionGeneratesUniqueMock() Chris@0: { Chris@0: $mockWithCloning = $this->getMockBuilder('SomeClass') Chris@0: ->setMethods(array('doSomethingElse')) Chris@0: ->enableArgumentCloning() Chris@0: ->getMock(); Chris@0: Chris@0: $mockWithoutCloning = $this->getMockBuilder('SomeClass') Chris@0: ->setMethods(array('doSomethingElse')) Chris@0: ->disableArgumentCloning() Chris@0: ->getMock(); Chris@0: Chris@0: $this->assertNotEquals($mockWithCloning, $mockWithoutCloning); Chris@0: } Chris@0: Chris@0: public function testVerificationOfMethodNameFailsWithoutParameters() Chris@0: { Chris@0: $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', true, true, true); Chris@0: $mock->expects($this->once()) Chris@0: ->method('right'); Chris@0: Chris@0: $mock->wrong(); Chris@0: try { Chris@0: $mock->__phpunit_verify(); Chris@0: $this->fail('Expected exception'); Chris@0: } catch (PHPUnit_Framework_ExpectationFailedException $e) { Chris@0: $this->assertSame( Chris@0: "Expectation failed for method name is equal to when invoked 1 time(s).\n" Chris@0: . "Method was expected to be called 1 times, actually called 0 times.\n", Chris@0: $e->getMessage() Chris@0: ); Chris@0: } Chris@0: Chris@0: $this->resetMockObjects(); Chris@0: } Chris@0: Chris@0: public function testVerificationOfMethodNameFailsWithParameters() Chris@0: { Chris@0: $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', true, true, true); Chris@0: $mock->expects($this->once()) Chris@0: ->method('right'); Chris@0: Chris@0: $mock->wrong(); Chris@0: try { Chris@0: $mock->__phpunit_verify(); Chris@0: $this->fail('Expected exception'); Chris@0: } catch (PHPUnit_Framework_ExpectationFailedException $e) { Chris@0: $this->assertSame( Chris@0: "Expectation failed for method name is equal to when invoked 1 time(s).\n" Chris@0: . "Method was expected to be called 1 times, actually called 0 times.\n", Chris@0: $e->getMessage() Chris@0: ); Chris@0: } Chris@0: Chris@0: $this->resetMockObjects(); Chris@0: } Chris@0: Chris@0: public function testVerificationOfMethodNameFailsWithWrongParameters() Chris@0: { Chris@0: $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', true, true, true); Chris@0: $mock->expects($this->once()) Chris@0: ->method('right') Chris@0: ->with(array('first', 'second')); Chris@0: Chris@0: try { Chris@0: $mock->right(array('second')); Chris@0: } catch (PHPUnit_Framework_ExpectationFailedException $e) { Chris@0: $this->assertSame( Chris@0: "Expectation failed for method name is equal to when invoked 1 time(s)\n" Chris@0: . "Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.\n" Chris@0: . "Failed asserting that two arrays are equal.", Chris@0: $e->getMessage() Chris@0: ); Chris@0: } Chris@0: Chris@0: try { Chris@0: $mock->__phpunit_verify(); Chris@0: $this->fail('Expected exception'); Chris@0: } catch (PHPUnit_Framework_ExpectationFailedException $e) { Chris@0: $this->assertSame( Chris@0: "Expectation failed for method name is equal to when invoked 1 time(s).\n" Chris@0: . "Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.\n" Chris@0: . "Failed asserting that two arrays are equal.\n" Chris@0: . "--- Expected\n" Chris@0: . "+++ Actual\n" Chris@0: . "@@ @@\n" Chris@0: . " Array (\n" Chris@0: . "- 0 => 'first'\n" Chris@0: . "- 1 => 'second'\n" Chris@0: . "+ 0 => 'second'\n" Chris@0: . " )\n", Chris@0: $e->getMessage() Chris@0: ); Chris@0: } Chris@0: Chris@0: $this->resetMockObjects(); Chris@0: } Chris@0: Chris@0: public function testVerificationOfNeverFailsWithEmptyParameters() Chris@0: { Chris@0: $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', true, true, true); Chris@0: $mock->expects($this->never()) Chris@0: ->method('right') Chris@0: ->with(); Chris@0: Chris@0: try { Chris@0: $mock->right(); Chris@0: $this->fail('Expected exception'); Chris@0: } catch (PHPUnit_Framework_ExpectationFailedException $e) { Chris@0: $this->assertSame( Chris@0: 'SomeClass::right() was not expected to be called.', Chris@0: $e->getMessage() Chris@0: ); Chris@0: } Chris@0: Chris@0: $this->resetMockObjects(); Chris@0: } Chris@0: Chris@0: public function testVerificationOfNeverFailsWithAnyParameters() Chris@0: { Chris@0: $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', true, true, true); Chris@0: $mock->expects($this->never()) Chris@0: ->method('right') Chris@0: ->withAnyParameters(); Chris@0: Chris@0: try { Chris@0: $mock->right(); Chris@0: $this->fail('Expected exception'); Chris@0: } catch (PHPUnit_Framework_ExpectationFailedException $e) { Chris@0: $this->assertSame( Chris@0: 'SomeClass::right() was not expected to be called.', Chris@0: $e->getMessage() Chris@0: ); Chris@0: } Chris@0: Chris@0: $this->resetMockObjects(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @ticket 199 Chris@0: */ Chris@0: public function testWithAnythingInsteadOfWithAnyParameters() Chris@0: { Chris@0: $mock = $this->getMock('SomeClass', array('right'), array(), '', true, true, true); Chris@0: $mock->expects($this->once()) Chris@0: ->method('right') Chris@0: ->with($this->anything()); Chris@0: Chris@0: try { Chris@0: $mock->right(); Chris@0: $this->fail('Expected exception'); Chris@0: } catch (PHPUnit_Framework_ExpectationFailedException $e) { Chris@0: $this->assertSame( Chris@0: "Expectation failed for method name is equal to when invoked 1 time(s)\n" . Chris@0: "Parameter count for invocation SomeClass::right() is too low.\n" . Chris@0: "To allow 0 or more parameters with any value, omit ->with() or use ->withAnyParameters() instead.", Chris@0: $e->getMessage() Chris@0: ); Chris@0: } Chris@0: Chris@0: $this->resetMockObjects(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * See https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81 Chris@0: */ Chris@0: public function testMockArgumentsPassedByReference() Chris@0: { Chris@0: $foo = $this->getMockBuilder('MethodCallbackByReference') Chris@0: ->setMethods(array('bar')) Chris@0: ->disableOriginalConstructor() Chris@0: ->disableArgumentCloning() Chris@0: ->getMock(); Chris@0: Chris@0: $foo->expects($this->any()) Chris@0: ->method('bar') Chris@0: ->will($this->returnCallback(array($foo, 'callback'))); Chris@0: Chris@0: $a = $b = $c = 0; Chris@0: Chris@0: $foo->bar($a, $b, $c); Chris@0: Chris@0: $this->assertEquals(1, $b); Chris@0: } Chris@0: Chris@0: /** Chris@0: * See https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81 Chris@0: */ Chris@0: public function testMockArgumentsPassedByReference2() Chris@0: { Chris@0: $foo = $this->getMockBuilder('MethodCallbackByReference') Chris@0: ->disableOriginalConstructor() Chris@0: ->disableArgumentCloning() Chris@0: ->getMock(); Chris@0: Chris@0: $foo->expects($this->any()) Chris@0: ->method('bar') Chris@0: ->will($this->returnCallback( Chris@0: function (&$a, &$b, $c) { Chris@0: $b = 1; Chris@0: } Chris@0: )); Chris@0: Chris@0: $a = $b = $c = 0; Chris@0: Chris@0: $foo->bar($a, $b, $c); Chris@0: Chris@0: $this->assertEquals(1, $b); Chris@0: } Chris@0: Chris@0: /** Chris@0: * https://github.com/sebastianbergmann/phpunit-mock-objects/issues/116 Chris@0: */ Chris@0: public function testMockArgumentsPassedByReference3() Chris@0: { Chris@0: $foo = $this->getMockBuilder('MethodCallbackByReference') Chris@0: ->setMethods(array('bar')) Chris@0: ->disableOriginalConstructor() Chris@0: ->disableArgumentCloning() Chris@0: ->getMock(); Chris@0: Chris@0: $a = new stdClass(); Chris@0: $b = $c = 0; Chris@0: Chris@0: $foo->expects($this->any()) Chris@0: ->method('bar') Chris@0: ->with($a, $b, $c) Chris@0: ->will($this->returnCallback(array($foo, 'callback'))); Chris@0: Chris@0: $foo->bar($a, $b, $c); Chris@0: } Chris@0: Chris@0: /** Chris@0: * https://github.com/sebastianbergmann/phpunit/issues/796 Chris@0: */ Chris@0: public function testMockArgumentsPassedByReference4() Chris@0: { Chris@0: $foo = $this->getMockBuilder('MethodCallbackByReference') Chris@0: ->setMethods(array('bar')) Chris@0: ->disableOriginalConstructor() Chris@0: ->disableArgumentCloning() Chris@0: ->getMock(); Chris@0: Chris@0: $a = new stdClass(); Chris@0: $b = $c = 0; Chris@0: Chris@0: $foo->expects($this->any()) Chris@0: ->method('bar') Chris@0: ->with($this->isInstanceOf("stdClass"), $b, $c) Chris@0: ->will($this->returnCallback(array($foo, 'callback'))); Chris@0: Chris@0: $foo->bar($a, $b, $c); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @requires extension soap Chris@0: */ Chris@0: public function testCreateMockFromWsdl() Chris@0: { Chris@0: $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl', 'WsdlMock'); Chris@0: $this->assertStringStartsWith( Chris@0: 'Mock_WsdlMock_', Chris@0: get_class($mock) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @requires extension soap Chris@0: */ Chris@0: public function testCreateNamespacedMockFromWsdl() Chris@0: { Chris@0: $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl', 'My\\Space\\WsdlMock'); Chris@0: $this->assertStringStartsWith( Chris@0: 'Mock_WsdlMock_', Chris@0: get_class($mock) Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @requires extension soap Chris@0: */ Chris@0: public function testCreateTwoMocksOfOneWsdlFile() Chris@0: { Chris@0: $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl'); Chris@0: $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/156 Chris@0: * @ticket 156 Chris@0: */ Chris@0: public function testInterfaceWithStaticMethodCanBeStubbed() Chris@0: { Chris@0: $this->assertInstanceOf( Chris@0: 'InterfaceWithStaticMethod', Chris@0: $this->getMock('InterfaceWithStaticMethod') Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @expectedException PHPUnit_Framework_MockObject_BadMethodCallException Chris@0: */ Chris@0: public function testInvokingStubbedStaticMethodRaisesException() Chris@0: { Chris@0: $mock = $this->getMock('ClassWithStaticMethod'); Chris@0: $mock->staticMethod(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/171 Chris@0: * @ticket 171 Chris@0: */ Chris@0: public function testStubForClassThatImplementsSerializableCanBeCreatedWithoutInvokingTheConstructor() Chris@0: { Chris@0: $this->assertInstanceOf( Chris@0: 'ClassThatImplementsSerializable', Chris@0: $this->getMockBuilder('ClassThatImplementsSerializable') Chris@0: ->disableOriginalConstructor() Chris@0: ->getMock() Chris@0: ); Chris@0: } Chris@0: Chris@0: private function resetMockObjects() Chris@0: { Chris@0: $refl = new ReflectionObject($this); Chris@0: $refl = $refl->getParentClass(); Chris@0: $prop = $refl->getProperty('mockObjects'); Chris@0: $prop->setAccessible(true); Chris@0: $prop->setValue($this, array()); Chris@0: } Chris@0: }