diff vendor/phpunit/phpunit-mock-objects/tests/MockObjectTest.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/phpunit/phpunit-mock-objects/tests/MockObjectTest.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,842 @@
+<?php
+/*
+ * This file is part of the PHPUnit_MockObject 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.
+ */
+
+/**
+ *
+ *
+ * @since      Class available since Release 3.0.0
+ */
+class Framework_MockObjectTest extends PHPUnit_Framework_TestCase
+{
+    public function testMockedMethodIsNeverCalled()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->never())
+             ->method('doSomething');
+    }
+
+    public function testMockedMethodIsNeverCalledWithParameter()
+    {
+        $mock = $this->getMock('SomeClass');
+        $mock->expects($this->never())
+            ->method('doSomething')
+            ->with('someArg');
+    }
+
+    public function testMockedMethodIsNotCalledWhenExpectsAnyWithParameter()
+    {
+        $mock = $this->getMock('SomeClass');
+        $mock->expects($this->any())
+             ->method('doSomethingElse')
+             ->with('someArg');
+    }
+
+    public function testMockedMethodIsNotCalledWhenMethodSpecifiedDirectlyWithParameter()
+    {
+        $mock = $this->getMock('SomeClass');
+        $mock->method('doSomethingElse')
+            ->with('someArg');
+    }
+
+    public function testMockedMethodIsCalledAtLeastOnce()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->atLeastOnce())
+             ->method('doSomething');
+
+        $mock->doSomething();
+    }
+
+    public function testMockedMethodIsCalledAtLeastOnce2()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->atLeastOnce())
+             ->method('doSomething');
+
+        $mock->doSomething();
+        $mock->doSomething();
+    }
+
+    public function testMockedMethodIsCalledAtLeastTwice()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->atLeast(2))
+             ->method('doSomething');
+
+        $mock->doSomething();
+        $mock->doSomething();
+    }
+
+    public function testMockedMethodIsCalledAtLeastTwice2()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->atLeast(2))
+             ->method('doSomething');
+
+        $mock->doSomething();
+        $mock->doSomething();
+        $mock->doSomething();
+    }
+
+    public function testMockedMethodIsCalledAtMostTwice()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->atMost(2))
+             ->method('doSomething');
+
+        $mock->doSomething();
+        $mock->doSomething();
+    }
+
+    public function testMockedMethodIsCalledAtMosttTwice2()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->atMost(2))
+             ->method('doSomething');
+
+        $mock->doSomething();
+    }
+
+    public function testMockedMethodIsCalledOnce()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->once())
+             ->method('doSomething');
+
+        $mock->doSomething();
+    }
+
+    public function testMockedMethodIsCalledOnceWithParameter()
+    {
+        $mock = $this->getMock('SomeClass');
+        $mock->expects($this->once())
+             ->method('doSomethingElse')
+             ->with($this->equalTo('something'));
+
+        $mock->doSomethingElse('something');
+    }
+
+    public function testMockedMethodIsCalledExactly()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->exactly(2))
+             ->method('doSomething');
+
+        $mock->doSomething();
+        $mock->doSomething();
+    }
+
+    public function testStubbedException()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->any())
+             ->method('doSomething')
+             ->will($this->throwException(new Exception));
+
+        try {
+            $mock->doSomething();
+        } catch (Exception $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    public function testStubbedWillThrowException()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->any())
+             ->method('doSomething')
+             ->willThrowException(new Exception);
+
+        try {
+            $mock->doSomething();
+        } catch (Exception $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    public function testStubbedReturnValue()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->any())
+             ->method('doSomething')
+             ->will($this->returnValue('something'));
+
+        $this->assertEquals('something', $mock->doSomething());
+
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->any())
+             ->method('doSomething')
+             ->willReturn('something');
+
+        $this->assertEquals('something', $mock->doSomething());
+    }
+
+    public function testStubbedReturnValueMap()
+    {
+        $map = array(
+            array('a', 'b', 'c', 'd'),
+            array('e', 'f', 'g', 'h')
+        );
+
+        $mock = $this->getMock('AnInterface');
+        $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->getMock('AnInterface');
+        $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->getMock('AnInterface');
+        $mock->expects($this->any())
+             ->method('doSomething')
+             ->will($this->returnArgument(1));
+
+        $this->assertEquals('b', $mock->doSomething('a', 'b'));
+
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->any())
+             ->method('doSomething')
+             ->willReturnArgument(1);
+
+        $this->assertEquals('b', $mock->doSomething('a', 'b'));
+    }
+
+    public function testFunctionCallback()
+    {
+        $mock = $this->getMock('SomeClass', array('doSomething'), array(), '', false);
+        $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->expects($this->once())
+             ->method('doSomething')
+             ->willReturnCallback('functionCallback');
+
+        $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
+    }
+
+    public function testStubbedReturnSelf()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->any())
+             ->method('doSomething')
+             ->will($this->returnSelf());
+
+        $this->assertEquals($mock, $mock->doSomething());
+
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->any())
+             ->method('doSomething')
+             ->willReturnSelf();
+
+        $this->assertEquals($mock, $mock->doSomething());
+    }
+
+    public function testStubbedReturnOnConsecutiveCalls()
+    {
+        $mock = $this->getMock('AnInterface');
+        $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->getMock('AnInterface');
+        $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->getMock('SomeClass', array('doSomething'), array(), '', false);
+        $mock->expects($this->once())
+             ->method('doSomething')
+             ->will($this->returnCallback(array('MethodCallback', 'staticCallback')));
+
+        $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
+    }
+
+    public function testPublicMethodCallback()
+    {
+        $mock = $this->getMock('SomeClass', array('doSomething'), array(), '', false);
+        $mock->expects($this->once())
+             ->method('doSomething')
+             ->will($this->returnCallback(array(new MethodCallback, 'nonStaticCallback')));
+
+        $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
+    }
+
+    public function testMockClassOnlyGeneratedOnce()
+    {
+        $mock1 = $this->getMock('AnInterface');
+        $mock2 = $this->getMock('AnInterface');
+
+        $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'));
+
+        $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->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');
+
+        $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));
+    }
+
+    /**
+     * @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);
+    }
+
+    public function testOriginalConstructorSettingConsidered()
+    {
+        $mock1 = $this->getMock('PartialMockTestClass');
+        $mock2 = $this->getMock('PartialMockTestClass', array(), array(), '', false);
+
+        $this->assertTrue($mock1->constructorCalled);
+        $this->assertFalse($mock2->constructorCalled);
+    }
+
+    public function testOriginalCloneSettingConsidered()
+    {
+        $mock1 = $this->getMock('PartialMockTestClass');
+        $mock2 = $this->getMock('PartialMockTestClass', array(), array(), '', true, false);
+
+        $this->assertNotEquals(get_class($mock1), get_class($mock2));
+    }
+
+    public function testGetMockForAbstractClass()
+    {
+        $mock = $this->getMock('AbstractMockTestClass');
+        $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);
+    }
+
+    public function testMultipleInterfacesCanBeMockedInSingleObject()
+    {
+        $mock = $this->getMock(array('AnInterface', 'AnotherInterface'));
+        $this->assertInstanceOf('AnInterface', $mock);
+        $this->assertInstanceOf('AnotherInterface', $mock);
+    }
+
+    /**
+     * @requires PHP 5.4.0
+     */
+    public function testGetMockForTrait()
+    {
+        $mock = $this->getMockForTrait('AbstractTrait');
+        $mock->expects($this->never())->method('doSomething');
+
+        $parent = get_parent_class($mock);
+        $traits = class_uses($parent, false);
+
+        $this->assertContains('AbstractTrait', $traits);
+    }
+
+    public function testClonedMockObjectShouldStillEqualTheOriginal()
+    {
+        $a = $this->getMock('stdClass');
+        $b = clone $a;
+        $this->assertEquals($a, $b);
+    }
+
+    public function testMockObjectsConstructedIndepentantlyShouldBeEqual()
+    {
+        $a = $this->getMock('stdClass');
+        $b = $this->getMock('stdClass');
+        $this->assertEquals($a, $b);
+    }
+
+    public function testMockObjectsConstructedIndepentantlyShouldNotBeTheSame()
+    {
+        $a = $this->getMock('stdClass');
+        $b = $this->getMock('stdClass');
+        $this->assertNotSame($a, $b);
+    }
+
+    public function testClonedMockObjectCanBeUsedInPlaceOfOriginalOne()
+    {
+        $x = $this->getMock('stdClass');
+        $y = clone $x;
+
+        $mock = $this->getMock('stdClass', array('foo'));
+        $mock->expects($this->once())->method('foo')->with($this->equalTo($x));
+        $mock->foo($y);
+    }
+
+    public function testClonedMockObjectIsNotIdenticalToOriginalOne()
+    {
+        $x = $this->getMock('stdClass');
+        $y = clone $x;
+
+        $mock = $this->getMock('stdClass', array('foo'));
+        $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(array('doSomethingElse'))
+                     ->enableArgumentCloning()
+                     ->getMock();
+
+        $actualArguments = array();
+
+        $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(array('doSomethingElse'))
+                     ->disableArgumentCloning()
+                     ->getMock();
+
+        $actualArguments = array();
+
+        $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(array('doSomethingElse'))
+                                ->enableArgumentCloning()
+                                ->getMock();
+
+        $mockWithoutCloning = $this->getMockBuilder('SomeClass')
+                                   ->setMethods(array('doSomethingElse'))
+                                   ->disableArgumentCloning()
+                                   ->getMock();
+
+        $this->assertNotEquals($mockWithCloning, $mockWithoutCloning);
+    }
+
+    public function testVerificationOfMethodNameFailsWithoutParameters()
+    {
+        $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', true, true, true);
+        $mock->expects($this->once())
+             ->method('right');
+
+        $mock->wrong();
+        try {
+            $mock->__phpunit_verify();
+            $this->fail('Expected exception');
+        } catch (PHPUnit_Framework_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",
+                $e->getMessage()
+            );
+        }
+
+        $this->resetMockObjects();
+    }
+
+    public function testVerificationOfMethodNameFailsWithParameters()
+    {
+        $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', true, true, true);
+        $mock->expects($this->once())
+             ->method('right');
+
+        $mock->wrong();
+        try {
+            $mock->__phpunit_verify();
+            $this->fail('Expected exception');
+        } catch (PHPUnit_Framework_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",
+                $e->getMessage()
+            );
+        }
+
+        $this->resetMockObjects();
+    }
+
+    public function testVerificationOfMethodNameFailsWithWrongParameters()
+    {
+        $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', true, true, true);
+        $mock->expects($this->once())
+             ->method('right')
+             ->with(array('first', 'second'));
+
+        try {
+            $mock->right(array('second'));
+        } catch (PHPUnit_Framework_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.",
+                $e->getMessage()
+            );
+        }
+
+        try {
+            $mock->__phpunit_verify();
+            $this->fail('Expected exception');
+        } catch (PHPUnit_Framework_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",
+                $e->getMessage()
+            );
+        }
+
+        $this->resetMockObjects();
+    }
+
+    public function testVerificationOfNeverFailsWithEmptyParameters()
+    {
+        $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', true, true, true);
+        $mock->expects($this->never())
+             ->method('right')
+             ->with();
+
+        try {
+            $mock->right();
+            $this->fail('Expected exception');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertSame(
+                'SomeClass::right() was not expected to be called.',
+                $e->getMessage()
+            );
+        }
+
+        $this->resetMockObjects();
+    }
+
+    public function testVerificationOfNeverFailsWithAnyParameters()
+    {
+        $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', true, true, true);
+        $mock->expects($this->never())
+             ->method('right')
+             ->withAnyParameters();
+
+        try {
+            $mock->right();
+            $this->fail('Expected exception');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertSame(
+                'SomeClass::right() was not expected to be called.',
+                $e->getMessage()
+            );
+        }
+
+        $this->resetMockObjects();
+    }
+
+    /**
+     * @ticket 199
+     */
+    public function testWithAnythingInsteadOfWithAnyParameters()
+    {
+        $mock = $this->getMock('SomeClass', array('right'), array(), '', true, true, true);
+        $mock->expects($this->once())
+             ->method('right')
+             ->with($this->anything());
+
+        try {
+            $mock->right();
+            $this->fail('Expected exception');
+        } catch (PHPUnit_Framework_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.",
+                $e->getMessage()
+            );
+        }
+
+        $this->resetMockObjects();
+    }
+
+    /**
+     * See https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81
+     */
+    public function testMockArgumentsPassedByReference()
+    {
+        $foo = $this->getMockBuilder('MethodCallbackByReference')
+                    ->setMethods(array('bar'))
+                    ->disableOriginalConstructor()
+                    ->disableArgumentCloning()
+                    ->getMock();
+
+        $foo->expects($this->any())
+            ->method('bar')
+            ->will($this->returnCallback(array($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);
+    }
+
+    /**
+     * https://github.com/sebastianbergmann/phpunit-mock-objects/issues/116
+     */
+    public function testMockArgumentsPassedByReference3()
+    {
+        $foo = $this->getMockBuilder('MethodCallbackByReference')
+                    ->setMethods(array('bar'))
+                    ->disableOriginalConstructor()
+                    ->disableArgumentCloning()
+                    ->getMock();
+
+        $a = new stdClass();
+        $b = $c = 0;
+
+        $foo->expects($this->any())
+            ->method('bar')
+            ->with($a, $b, $c)
+            ->will($this->returnCallback(array($foo, 'callback')));
+
+        $foo->bar($a, $b, $c);
+    }
+
+    /**
+     * https://github.com/sebastianbergmann/phpunit/issues/796
+     */
+    public function testMockArgumentsPassedByReference4()
+    {
+        $foo = $this->getMockBuilder('MethodCallbackByReference')
+                    ->setMethods(array('bar'))
+                    ->disableOriginalConstructor()
+                    ->disableArgumentCloning()
+                    ->getMock();
+
+        $a = new stdClass();
+        $b = $c = 0;
+
+        $foo->expects($this->any())
+            ->method('bar')
+            ->with($this->isInstanceOf("stdClass"), $b, $c)
+            ->will($this->returnCallback(array($foo, 'callback')));
+
+        $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()
+    {
+        $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl');
+        $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl');
+    }
+
+    /**
+     * @see    https://github.com/sebastianbergmann/phpunit-mock-objects/issues/156
+     * @ticket 156
+     */
+    public function testInterfaceWithStaticMethodCanBeStubbed()
+    {
+        $this->assertInstanceOf(
+            'InterfaceWithStaticMethod',
+            $this->getMock('InterfaceWithStaticMethod')
+        );
+    }
+
+    /**
+     * @expectedException PHPUnit_Framework_MockObject_BadMethodCallException
+     */
+    public function testInvokingStubbedStaticMethodRaisesException()
+    {
+        $mock = $this->getMock('ClassWithStaticMethod');
+        $mock->staticMethod();
+    }
+
+    /**
+     * @see    https://github.com/sebastianbergmann/phpunit-mock-objects/issues/171
+     * @ticket 171
+     */
+    public function testStubForClassThatImplementsSerializableCanBeCreatedWithoutInvokingTheConstructor()
+    {
+        $this->assertInstanceOf(
+            'ClassThatImplementsSerializable',
+            $this->getMockBuilder('ClassThatImplementsSerializable')
+                 ->disableOriginalConstructor()
+                 ->getMock()
+        );
+    }
+
+    private function resetMockObjects()
+    {
+        $refl = new ReflectionObject($this);
+        $refl = $refl->getParentClass();
+        $prop = $refl->getProperty('mockObjects');
+        $prop->setAccessible(true);
+        $prop->setValue($this, array());
+    }
+}