Singleton Pattern mit PHPUnit testen

Geschrieben von Dejan Spasic • Tuesday, 24. February 2009 • Kommentar (1)
Das Singleton (auch Einzelstück genannt) ist ein in der Softwareentwicklung eingesetztes Entwurfsmuster und gehört zur Kategorie der Erzeugungsmuster (engl. Creational Patterns). Es verhindert, dass von einer Klasse mehr als ein Objekt erzeugt werden kann. Dieses Einzelstück ist darüber hinaus üblicherweise global verfügbar. Das Muster ist eines der von der so genannten Viererbande (GoF) publizierten Muster.
Quelle: Wikipedia

Die Klasse

class Singleton
{
   // Anlegen der Instanz
   private static $self = null; 
 
   //Konstruktor private, damit die Klasse nur aus sich selbst heraus instanziiert werden kann.
   private function __construct()
   {
   } 
 
   // Diese statische Methode gibt IMMER die selbe Instanz zurueck.
   public static function getInstance()
   {
       if (null === self::$self) {
           self::$self = new self;
       }
       return self::$self;
   } 
 
   // Klonen per 'clone()' von außen verbieten.
   private function __clone()
   {
   } 
 } 

Der Unittest

/**
 * TestCase for Singelton class
 * 
 * @category   UnitTests
 * @package    DDown
 * @subpackage DesignPatterns
 */
class SingletonTest extends PHPUnit_Framework_TestCase
{
	/**
	 * Testing the singelton pattern
	 * @return void
	 * @covers Singleton::getInstance
	 * @covers Singleton::__constructor
	 * @covers Singleton::__clone
	 * @link http://en.wikipedia.org/wiki/Singleton_pattern Singleton pattern
	 */
	public function testSingleton()
	{
		self::assertTrue(
			Singleton::getInstance() === Singleton::getInstance(),
			'Singelton seems not working!'
		);
 
		$clazz = new ReflectionClass('Singleton');
 
		self::assertFalse(
			$clazz->isInstantiable(),
			'Singleton instantiable. Please declare the construct as '
			. 'private or protected'
		);
 
		try {
			$cloneMethod = $clazz->getMethod('__clone');
		} catch (ReflectionException $e) {
			self::fail($e->getMessage());
		}
 
		self::assertTrue($cloneMethod->isPrivate(), 'Singleton is clonable');
	}
}

Weiterführenden Lieteratur

Tags für diesen Artikel: ,