Home > PHP | 開発環境 > PHPUnitでMockオブジェクトを使う2

PHPUnitでMockオブジェクトを使う2

この記事の所要時間: 338

PHPUnitでMockオブジェクトを使うで紹介したMockオブジェクトですが、これは元クラスを継承しているわけではないので当然ながら元クラスの実装は使えません。

ただテストする場面によっては、基本は元クラスの振る舞いをして、一部のメソッドだけMockにしたいという場合があります。

そこで元クラスを継承したMockオブジェクトを作ってみます。

元クラス

< ?php
class Hoge {
  // このメソッドはそのまま
  function execute() {
    if ($this->request()) {
      // OK
      return 1;
    } else {
      // NG
      return -1;
    }
  }

  // このメソッドをMockにしたい
  function request(&$db) {
    $db->query();
    sleep(100);
    return true;
  }
}
?>

テストケース

Mockオブジェクトをテストケースに書いています。単にHogeクラスを継承してrequest()をオーバーライドするだけです。

< ?php
require_once 'PHPUnit.php';
require_once 'Hoge.php';

class MockHoge extends Hoge {
  function request() {
    return true;
  }
}

class HogeTest extends PHPUnit_TestCase {
  function testExecute() {
    $obj = new MockHoge();
    $this->assertTrue($obj->execute());
  }
}

$suite = new PHPUnit_TestSuite('HogeTest');
$result = PHPUnit::run($suite);
echo $result->toString();
?>

テストケース-返り値を設定

こちらではMockHogeに変数を追加して、インスタンス変数に応じてrequest()メソッドの返り値が変わるようにしています。

< ?php
require_once 'PHPUnit.php';
require_once 'Hoge.php';

class MockHoge extends Hoge {
  var $mockRequestValue;

  function request() {
    return $this->mockRequestValue;
  }
}

class HogeTest extends PHPUnit_TestCase {
  function testExecute() {
    $obj = new MockHoge();

    $obj->mockRequestValue = true;
    $this->assertEquals(1, $obj->execute());
    $obj->mockRequestValue = false;
    $this->assertEquals(-1, $obj->execute());
  }
}

$suite = new PHPUnit_TestSuite('HogeTest');
$result = PHPUnit::run($suite);
echo $result->toString();
?>

この方法では(Mockオブジェクト用の)コンポーネントは必要ないので手軽にMockオブジェクトを使う事ができます。また元クラスの実装を生かせるのでこの例のように一部だけを変えたい場合には有用です。

SimpleTestのようなMockオブジェクトとケースバイケースで使い分けるのが良いですね。

Pocket

follow us in feedly

トラックバック:0

このエントリーのトラックバックURL
/blog/2006/11/php_phpunit_mock2.html/trackback
Listed below are links to weblogs that reference
PHPUnitでMockオブジェクトを使う2 from Shin x blog

Home > PHP | 開発環境 > PHPUnitでMockオブジェクトを使う2

検索
フィード
メタ情報

Return to page top