Mock
- 2. テストダブルとは
テストに使いづらいオブジェクトの代替
例: スタブ、モック、フェイク、スパイ
どれもメソッドの差し替えを行う
目的が違う
13年1月15日火曜日
- 3. モックとは
テスト対象が適切なメソッド呼び出しを
行っているかを検証
相互作用の検証 (⇔ 状態の検証)
13年1月15日火曜日
- 5. 実装するためには…
@Test public void メールを送る1() {
mailServer.send("hello", "alice@example.com");
// assertThat(...) example.comへの送信をテストしたいが??
}
13年1月15日火曜日
- 6. 実装するためには…
@Test public void メールを送る1() {
mailServer.send("hello", "alice@example.com");
// assertThat(...) example.comへの送信をテストしたいが??
}
mailServer クラス自身
ではテストを書けない
13年1月15日火曜日
- 7. 相互作用の対象を確認する
@Test public void メールを送る2() {
mailServer.send("hello", "alice@example.com");
assertThat(mailbox.getMail("alice").get(0), is("hello"));
}
13年1月15日火曜日
- 8. 相互作用の対象を確認する
@Test public void メールを送る2() {
mailServer.send("hello", "alice@example.com");
assertThat(mailbox.getMail("alice").get(0), is("hello"));
}
mailbox.getMailの実装
が必要
13年1月15日火曜日
- 9. 相互作用の対象を確認する
@Test public void メールを送る2() {
mailServer.send("hello", "alice@example.com");
assertThat(mailbox.getMail("alice").get(0), is("hello"));
}
mailbox.getMailの実装 mailbox の実装が間違
が必要 っていたらエラー
13年1月15日火曜日
- 10. 相互作用の対象を確認する
@Test public void メールを送る2() {
mailServer.send("hello", "alice@example.com");
assertThat(mailbox.getMail("alice").get(0), is("hello"));
}
mailbox.getMailの実装 mailbox の実装が間違
が必要 っていたらエラー
そもそも mailbox.getMail は
プロダクトに必要?
13年1月15日火曜日
- 11. 例: メールシステム
@Test public void メールを送る3() {
mailServer.send("hello", "alice@example.com");
verify(mailbox).putMail("alice@example.com", "hello");
}
13年1月15日火曜日
- 12. 例: メールシステム
@Test public void メールを送る3() {
mailServer.send("hello", "alice@example.com");
verify(mailbox).putMail("alice@example.com", "hello");
}
mailbox.putMailのイン
タフェースのみが必要
13年1月15日火曜日
- 13. モックのメリット
簡潔な記述
テストの他クラスへの依存性の排除
インタフェースが用意されていれば良い
テスト用コードの排除
13年1月15日火曜日
- 15. 自分の物だけをモックする
モックは外部システムのシミュレートす
る物ではない
テストの複雑化
外部システムのAPIを直接触るのは避ける
アダプターを用意する
13年1月15日火曜日
- 16. TELL, DON'T ASK
デメテルの法則
これも依存性の排除のため
getXXX().getYYY().getZZZ() // ← 隠れた依存性!
13年1月15日火曜日