tanigonのS2部屋

メイン日記はこちら(tanigonの日記)

2004-06-22

mockメモ

MockObjectsのjarに含まれるHttpServletのmockなんかは「いますぐ擬態できる」みたいな感じのmock(意味不明)だが、jMockやEasyMockみたいな動的生成(Dynamic Proxy型だったり)のMockは DAOなパターンで作る場合には必須。

 そもそもダイコン時代だとクラス間というよりかは インタフェース間?の間を分離してテストすることでテストの粒度が揃えられると思うので、Mockテストは効果的。、、、と実務上の経験的にも間違いない。(まあ、本当に「他と比べて」効率的かどうかは比較してないのでわからないのだが、「やってよかった」と数回思った)

 MockObjectsかなんかの説明に「いかにMockがStubと違うか」というあたりでアサーション(verify)の機能とかいろいろのってたが、このへんの要件っておおよそMockパッケージ?によってあんまり変わらない気がする。

  • コール回数に対する限定的なexpectation
  • 何度コールされてもいい、というようなコール回数に対するexpectation
  • 引数ホニャララで呼ばれること、というexpectation
  • その時に戻り値、throwがどうだ、ということを指定できること
  • 引数ホニャララについては範囲が指定できたりする
  • mockパッケージによっては、コンクリートクラスに対するブリッジみたいに機能するmockの振る舞いを作れる。mock.setなんちゃら(concrete)みたいな?

 ひがさんがMockInterceptorの話をしていたのですが上のようなことを<arg>とかで書くのかな? OGNLとか、initMethodも使えるからそこはかなり自由度がありそうだ。

が、しかし、個人的には(思考のワナ)

 うえのような"Expectation"はmockの側面のうち

  • テストしたいクラスを限定する(依存するインタフェースの実装から分離する)
  • テストしたいクラス/メソッドがどのように他クラスにインタラクションするかを検証する

 という2つの側面があるように思える。イメージ的には前者のほうがブラックボックス的で、後者のほうがホワイトボックス的。というのは、後者の場合に厳密なexpectationが実施できる、ということは、依存対象のクラスの機能粒度にもよるけど

 ということなので、なんか場合によってはこれは「細かすぎる」こともあるのかも? ユニットテストなんで別にいいんですが、メソッドやクラスの外部設計レベルの仕様から ここまでのexpectationが書けるんだろうか? まだちょっと疑問。(いわゆる詳細設計や処理フローの設計があれば別だが、生産物的にはあんまり(なんだよ))

 で、まあ、それはヨシとしたとしても

  • expectationの内容など mockに設定する内容はかなり深くテストメソッドの処理に依存する
  • もしくは、テストメソッドの処理はexpectationの内容などの設定に強く依存する

 ということは言えるのではないか。あるテスト testHoge() がテスト対象クラスにどうインタラクションするかにはかなり強く依存するはず。そうでないと、「こう呼ばれるはず」ということが設定できないだろうから、testHoge()の単位で相互に依存している、と考えられるのでは。(相互ではないかも。testHoge() が mockのexpectationの設定内容に強く依存するのか)

 このへんを考えると、ひがさんが書いておられた MockInterceptorの設定も私の場合はきっと .dicon に書くことはなくて、手動ケースになるのかなあ。でも、なんかこれだと面白くない。.diconこそわが命(それは言いすぎ)。でもテストの処理の中で何度もmockのexpectationは変更するんだろうしなあ・・・

 また答えの出ない思考のワナに旅立つ。

そういえば

groovy beta6のCVSに含まれてる GroovyMockが気になる。

higayasuohigayasuo2004/06/23 00:18モックはやっぱりブラックボックスで、ホワイトボックス的なテストってどうよっておもいはありますが、どうっすかね。テストはインターフェースに基づいた方が良いと思ってます。中身じゃなくて。

tanigontanigon2004/06/23 03:10まさにそう思います。しかしtestHoge()での使い方の例として出てくるのは 厳密な expcetationの例ばっかりでどうもホワイトボックスな気がしませんか。mockはmockらしくブラックボックスに振舞う・・・としたら、stubなんでしょうか driverなんでしょうか。いずれにせよ『古くから知られた』テスト方法になって然りなんですよね。 世間の例に惑わされすぎ?