狠狠撸

狠狠撸Share a Scribd company logo
モックについて
                2013.01.15




13年1月15日火曜日
テストダブルとは

       テストに使いづらいオブジェクトの代替

          例: スタブ、モック、フェイク、スパイ


       どれもメソッドの差し替えを行う

       目的が違う


13年1月15日火曜日
モックとは


       テスト対象が適切なメソッド呼び出しを
       行っているかを検証

       相互作用の検証 (? 状態の検証)



13年1月15日火曜日
例: メールシステム




13年1月15日火曜日
実装するためには…

  @Test	 public	 void	 メールを送る1()	 {	 
  	 	 	 	 mailServer.send("hello",	 "alice@example.com");

  	 	 	 	 //	 assertThat(...)	 example.comへの送信をテストしたいが??
  }




13年1月15日火曜日
実装するためには…

  @Test	 public	 void	 メールを送る1()	 {	 
  	 	 	 	 mailServer.send("hello",	 "alice@example.com");

  	 	 	 	 //	 assertThat(...)	 example.comへの送信をテストしたいが??
  }


                          mailServer クラス自身
                         ではテストを書けない




13年1月15日火曜日
相互作用の対象を確認する

  @Test	 public	 void	 メールを送る2()	 {	 
  	 	 	 	 mailServer.send("hello",	 "alice@example.com");

  	 	 	 	 assertThat(mailbox.getMail("alice").get(0),	 is("hello"));
  }




13年1月15日火曜日
相互作用の対象を確認する

  @Test	 public	 void	 メールを送る2()	 {	 
  	 	 	 	 mailServer.send("hello",	 "alice@example.com");

  	 	 	 	 assertThat(mailbox.getMail("alice").get(0),	 is("hello"));
  }
     mailbox.getMailの実装
              が必要




13年1月15日火曜日
相互作用の対象を確認する

  @Test	 public	 void	 メールを送る2()	 {	 
  	 	 	 	 mailServer.send("hello",	 "alice@example.com");

  	 	 	 	 assertThat(mailbox.getMail("alice").get(0),	 is("hello"));
  }
     mailbox.getMailの実装                 mailbox の実装が間違
              が必要                         っていたらエラー




13年1月15日火曜日
相互作用の対象を確認する

  @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日火曜日
例: メールシステム

  @Test	 public	 void	 メールを送る3()	 {	 
  	 	 	 	 mailServer.send("hello",	 "alice@example.com");

  	 	 	 	 verify(mailbox).putMail("alice@example.com",	 "hello");
  }




13年1月15日火曜日
例: メールシステム

  @Test	 public	 void	 メールを送る3()	 {	 
  	 	 	 	 mailServer.send("hello",	 "alice@example.com");

  	 	 	 	 verify(mailbox).putMail("alice@example.com",	 "hello");
  }
     mailbox.putMailのイン
     タフェースのみが必要




13年1月15日火曜日
モックのメリット

       簡潔な記述

       テストの他クラスへの依存性の排除

          インタフェースが用意されていれば良い


       テスト用コードの排除


13年1月15日火曜日
注意点




13年1月15日火曜日
自分の物だけをモックする

       モックは外部システムのシミュレートす
       る物ではない

          テストの複雑化

          外部システムのAPIを直接触るのは避ける


       アダプターを用意する

13年1月15日火曜日
TELL, DON'T ASK


       デメテルの法則

       これも依存性の排除のため

          getXXX().getYYY().getZZZ() // ← 隠れた依存性!




13年1月15日火曜日

More Related Content

Mock

  • 1. モックについて 2013.01.15 13年1月15日火曜日
  • 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日火曜日