EasyMock

EasyMock って昔 (っていっても昨年だよなぁ,きっと) 雑誌で読んだことがある程度だったのですが,その時の印象があまりよくなくてずっと興味ありませんでした.
なぜに印象が悪かったのかあまり憶えていないのですが (健忘なので),普通のテストケースでは

  • こうすると
  • こうなるはず
  • こうすると
  • こうなるはず

というリズムになるところが,

  • こうなるはず
  • こうなるはず
  • replay()
  • こうすると
  • こうすると
  • verify()

になっちゃうことに抵抗を感じたのではないかと.たぶん.
だったのですが,最近 without-ejb ML で和田さんが紹介してくれた記事というか,かくたにさんが紹介してくれたその翻訳記事を読んで,ちょっと興味が出てきちゃいました.


実は今 JCA遊んでいる遊ばれているのですが,JCA (の SPI) ってたくさんのインタフェースとそのインタラクションが決められているんですよね.例えば ConnectionManagerManagedConnectionFactory から ManagedConnection をもらってきて,ManagedConnection からもらった XAResourceTransactionManager からもらった TransactionenlistResource() して最後に ManagedConnection からもらったコネクション (Object型) を返すとか.
で,昨日までは例えば ConnectionManager 実装クラスをテストするのに ManagedConnectionFactory 実装クラスを継承した匿名クラスや内部クラスを使って都合のいいように振る舞わせていたのですが,これだとテストクラスがいろいろな実装クラスを使いまくることになるのがちょっとなんだかなーで,どっかバグるとみんな動かなくなったりみたいなのも悩みどころだったのです.


そんなわけで (どんなわけで?),EasyMock を使ってテストを書き換えてみたら,随分とすっきり♪
JCA 実装クラスの多くって,collaborator への参照以外にフィールドがほとんどなくて,「状態中心のテスト」がやりにくかったのですが,なるほど「相互作用中心のテスト」で考えればよかったのね.勉強になりました.
本当に単体テストになっちゃって,なんとなく結合テストを兼ねていたのがなくなってしまうので別途明示的に結合テストが必要だなぁって感じですが,しばらく使ってみることにします.


ってことは,S2Axis のあの辺りでもこれが使えるのだろうか?
...
うーみゅ,あいつはスーパークラス (Axis が提供するクラス) と相互作用するテストをしたいんだよなぁ.つまり,スーパークラスをモックに置き換えたいんだよなぁ.さすがにそれは無理だなぁ.Genericsextends T ができればそういうテストもやりやすくなるんだけどなぁ.っていうかそこまでするくらいならサブクラスから処理を外に出せってことですかそうですか.
っていうか Axis 1.2Final が遂にリリースされたっぽい.ML でアナウンスが流れてます.JCA は中断して S2Axis するか...