2012年4月17日火曜日

クラスのインターフェイスを利用する

このエントリーをはてなブックマークに追加
Javaでテストコードを書いたことのある人は、次のようなコードをたくさん書いたことがあると思います。
// テストコードを含む典型的なJavaのコード

// インターフェイス
interface IDuck {
  void quack();
}

// 実装クラス
class Duck implements IDuck {
  void quack() { /* ... */ }
}

// テスト用のモック クラス
class MockDuck implements IDuck {
  void quack() { /* ... */ }
}
本来、実装に必要なのはDuckクラスだけですが、自動テストのためにIDuckインターフェイスを作り、そこからテスト用のモック クラスを用意しています。モックを自動生成するライブラリもいくつかありますが、設定の手間が必要だったり、コードがJavaの言語仕様からみると不自然な感じになったりしてしまいます。(それでも便利ですが)

Dartでも同じように書くことはできますが、Dartではクラスをインターフェイスとして利用できます。つまり、モックを作るためにインターフェイスを用意する必要はなく、クラスから直接モック クラスを作ることができます。サンプルコード
// 実装クラス
class Duck {
  quack() => 'complicated enterprise n-tier quack';
}

// テスト用のモック クラス
// Duckクラスを実装(implements)する。
class MockDuck implements Duck {
  quack() => 'quack for testing';
}

main() {
  Duck duck = new MockDuck();
  print(duck is Duck); // true
  print(duck.quack()); // quack for testing
}
MockDuckクラスはDuckクラスを実装(implements)しています。もちろん、MockDuckではquackメソッドを実装する必要があります。

なお、この機能は、Dartboard(try.dartlang.org)では問題なく利用できますが、現在公開されている最新のDart Editor(ビルド6479、2012/4/12公開)では不具合があるため利用できません。すでに修正されていますので次のリリースから利用できると思います。

0 件のコメント:

コメントを投稿