Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
 * Mocking nonexistent classes in a namespace is now possible.
  • Loading branch information
whatthejeff committed Apr 3, 2011
1 parent 4173460 commit 32a8ec6
Show file tree
Hide file tree
Showing 5 changed files with 247 additions and 2 deletions.
10 changes: 9 additions & 1 deletion PHPUnit/Framework/MockObject/Generator.php
Expand Up @@ -399,7 +399,10 @@ protected static function generateMock($originalClassName, $methods, $mockClassN

if (!empty($mockClassName['namespaceName'])) {
$prologue = 'namespace ' . $mockClassName['namespaceName'] .
";\n\n" . $prologue;
" {\n\n" . $prologue . "}\n\n" .
"namespace {\n\n";

$epilogue = "\n\n}";
}

$cloneTemplate = new Text_Template(
Expand Down Expand Up @@ -491,6 +494,7 @@ protected static function generateMock($originalClassName, $methods, $mockClassN
$classTemplate->setVar(
array(
'prologue' => isset($prologue) ? $prologue : '',
'epilogue' => isset($epilogue) ? $epilogue : '',
'class_declaration' => self::generateMockClassDeclaration(
$mockClassName, $isInterface
),
Expand All @@ -513,6 +517,10 @@ protected static function generateMock($originalClassName, $methods, $mockClassN
*/
protected static function generateMockClassName($originalClassName, $mockClassName)
{
if ($originalClassName[0] == '\\') {
$originalClassName = substr($originalClassName, 1);
}

$classNameParts = explode('\\', $originalClassName);

if (count($classNameParts) > 1) {
Expand Down
Expand Up @@ -43,4 +43,4 @@
self::$staticInvocationMocker = NULL;
$this->invocationMocker = NULL;
}
}
}{epilogue}
71 changes: 71 additions & 0 deletions Tests/MockObject/nonexistent_class.phpt
@@ -0,0 +1,71 @@
--TEST--
PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', TRUE, TRUE)
--FILE--
<?php
require_once 'PHPUnit/Autoload.php';

$mock = PHPUnit_Framework_MockObject_Generator::generate(
'Foo',
array(),
'MockFoo',
TRUE,
TRUE
);

print $mock['code'];
?>
--EXPECTF--
class Foo
{
}

class MockFoo extends Foo implements PHPUnit_Framework_MockObject_MockObject
{
protected static $staticInvocationMocker;
protected $invocationMocker;

public function __clone()
{
$this->invocationMocker = clone $this->__phpunit_getInvocationMocker();
}

public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
{
return $this->__phpunit_getInvocationMocker()->expects($matcher);
}

public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
{
return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
}

public function __phpunit_getInvocationMocker()
{
if ($this->invocationMocker === NULL) {
$this->invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
}

return $this->invocationMocker;
}

public static function __phpunit_getStaticInvocationMocker()
{
if (self::$staticInvocationMocker === NULL) {
self::$staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
}

return self::$staticInvocationMocker;
}

public function __phpunit_verify()
{
self::__phpunit_getStaticInvocationMocker()->verify();
$this->__phpunit_getInvocationMocker()->verify();
}

public function __phpunit_cleanup()
{
self::$staticInvocationMocker = NULL;
$this->invocationMocker = NULL;
}
}
83 changes: 83 additions & 0 deletions Tests/MockObject/nonexistent_class_with_namespace.phpt
@@ -0,0 +1,83 @@
--TEST--
PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', TRUE, TRUE)
--SKIPIF--
<?php
if (!version_compare(PHP_VERSION, '5.3.0', '>=')) echo 'skip: PHP 5.3 only';
?>
--FILE--
<?php
require_once 'PHPUnit/Autoload.php';

$mock = PHPUnit_Framework_MockObject_Generator::generate(
'NS\Foo',
array(),
'MockFoo',
TRUE,
TRUE
);

print $mock['code'];
?>
--EXPECTF--
namespace NS {

class Foo
{
}

}

namespace {

class MockFoo extends NS\Foo implements PHPUnit_Framework_MockObject_MockObject
{
protected static $staticInvocationMocker;
protected $invocationMocker;

public function __clone()
{
$this->invocationMocker = clone $this->__phpunit_getInvocationMocker();
}

public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
{
return $this->__phpunit_getInvocationMocker()->expects($matcher);
}

public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
{
return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
}

public function __phpunit_getInvocationMocker()
{
if ($this->invocationMocker === NULL) {
$this->invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
}

return $this->invocationMocker;
}

public static function __phpunit_getStaticInvocationMocker()
{
if (self::$staticInvocationMocker === NULL) {
self::$staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
}

return self::$staticInvocationMocker;
}

public function __phpunit_verify()
{
self::__phpunit_getStaticInvocationMocker()->verify();
$this->__phpunit_getInvocationMocker()->verify();
}

public function __phpunit_cleanup()
{
self::$staticInvocationMocker = NULL;
$this->invocationMocker = NULL;
}
}

}
@@ -0,0 +1,83 @@
--TEST--
PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', TRUE, TRUE)
--SKIPIF--
<?php
if (!version_compare(PHP_VERSION, '5.3.0', '>=')) echo 'skip: PHP 5.3 only';
?>
--FILE--
<?php
require_once 'PHPUnit/Autoload.php';

$mock = PHPUnit_Framework_MockObject_Generator::generate(
'\NS\Foo',
array(),
'MockFoo',
TRUE,
TRUE
);

print $mock['code'];
?>
--EXPECTF--
namespace NS {

class Foo
{
}

}

namespace {

class MockFoo extends NS\Foo implements PHPUnit_Framework_MockObject_MockObject
{
protected static $staticInvocationMocker;
protected $invocationMocker;

public function __clone()
{
$this->invocationMocker = clone $this->__phpunit_getInvocationMocker();
}

public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
{
return $this->__phpunit_getInvocationMocker()->expects($matcher);
}

public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
{
return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
}

public function __phpunit_getInvocationMocker()
{
if ($this->invocationMocker === NULL) {
$this->invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
}

return $this->invocationMocker;
}

public static function __phpunit_getStaticInvocationMocker()
{
if (self::$staticInvocationMocker === NULL) {
self::$staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
}

return self::$staticInvocationMocker;
}

public function __phpunit_verify()
{
self::__phpunit_getStaticInvocationMocker()->verify();
$this->__phpunit_getInvocationMocker()->verify();
}

public function __phpunit_cleanup()
{
self::$staticInvocationMocker = NULL;
$this->invocationMocker = NULL;
}
}

}

0 comments on commit 32a8ec6

Please sign in to comment.