ファクトリメソッドが楽しすぎる
PHPだと
(new Hoge())->fuga()
とかできないので、ファクトリメソッドにして
class Hoge
{
public static function getInstance()
{
return new self();
}
}
Hoge::getInstance()->fuga();
と、メソッドチェイン万歳なのですが、 テストでモックを使うときに便利だったり。
function foo($x)
{
$hoge = new Hoge($x);
return $hoge->fuga();
}
みたいな関数 foo()
をテストしたい、
そのとき Hoge
は本当の Hoge
ではなく
モックを使いたい、となったらどうするか。
まあ、この例でいえば foo($x)
という関数が妙なので、
foo($hoge, $x)
となるのがいいんじゃないかと思いますが、
例ですのでご容赦を。
class Hoge
{
public static $mock = null;
public static function getInstance()
{
if (self::$mock) {
return self::$mock;
} else {
return new self();
}
}
}
function foo($x)
{
$hoge = Hoge::getInstance($x);
return $hoge->fuga();
}
function testFoo()
{
Hoge::$mock = new HogeMock();
foo($x);
}
テストケースで Hoge::$mock
を設定してやれば、
Hoge::getInstance
を使う箇所では
モックかどうかを気にせずにコードが書けます。