DI(Dependency injection) は依存性の注入の意味です。
ここで言う「依存性」は、オブジェクト思考でいうと大まかに「クラスファイル」と考えて良いかと。
そしてそのクラスが特定の定数、変数、インスタンスに依存しまい、単体テストに支障がでている状態です。
class Dog {
public function isBow() {
$person = new Person();
return ($person->action() == 'walk');
}
}
class TestDog {
public function testBow() {
$dog = new Dog();
$this->assertTrue($dog->isBow());
}
}
上記だと、Dogクラス内にPersonクラスに依存してしまってます。 「$person->action() == 'walk'」の実装が変わってしまうと、assertTrue() した結果は、Personクラスが変更があった場合に変わってしまいます。
解決方法としては、Dogクラスの動作させるメソッドでインスタンスを作成せずに、コンストラクタやセッターに、Personを入れて(注入)して解決します。
class Dog {
protected $person;
public function __construct(Person $person) {
$this->person = $person;
}
public function isBow() {
return ($this->person->action() == 'walk');
}
}
class TestDog {
public function testBow() {
$person = new Person();
$person->expects($this->any())
->method('action')
->will($this->returnValue('walk'));
$dog = new Dog($person);
$this->assertTrue($dog->isBow());
}
}