I was wondering whether it's possible to inject dependencies into classes derived from PHPUnit_Framework_TestCase via e.g. some context test suite - in a manner that PHPUnit could handle irregardless whether it has been invoked manually, with a phpunit.xml configuration file or else?
Please consider the following example:
<?php
interface AnyGreeter {
public function greet($recipient);
}
class FriendlyGreeter implements AnyGreeter {
public function greet($recipient) {
return "Hello {$recipient}!";
}
}
class DorkGreeter implements AnyGreeter {
public function greet($recipient) {
return "Get lost, {$recipient}!";
}
}
Now I want to provide some general test for classes implementing AnyGreeter, e.g.:
<?php
class GeeterTest extends PHPUnit_Framework_TestCase {
public function testGreet() {
$greeter = $this->getGreeter();
$message = $greeter->greet("world");
$this->assertContains("world", $message);
}
public function setGreeter(AnyGreeter $greeter) {
$this->greeter = $greeter;
}
public function getGreeter() {
if (null === $this->greeter) {
$this->markTestSkipped("No greeter provided");
}
return $this->greeter;
}
private $greeter;
}
This may get re-used by my own as well as any future implementations (which I do not control).
How is this possible, especially in a project that relies on interfaces heavily? I don't want to write abstract tests and extend them for every single implementation --
Thanks!
AbstractGreeter?AbstractGreeteralso - but implementors ofAnyGreeterare not forced to use it, of course.