EasyMock
EasyMock って昔 (っていっても昨年だよなぁ,きっと) 雑誌で読んだことがある程度だったのですが,その時の印象があまりよくなくてずっと興味ありませんでした.
なぜに印象が悪かったのかあまり憶えていないのですが (健忘なので),普通のテストケースでは
- こうすると
- こうなるはず
- こうすると
- こうなるはず
というリズムになるところが,
- こうなるはず
- こうなるはず
- replay()
- こうすると
- こうすると
- verify()
になっちゃうことに抵抗を感じたのではないかと.たぶん.
だったのですが,最近 without-ejb ML で和田さんが紹介してくれた記事というか,かくたにさんが紹介してくれたその翻訳記事を読んで,ちょっと興味が出てきちゃいました.
実は今 JCA で遊んでいる遊ばれているのですが,JCA (の SPI) ってたくさんのインタフェースとそのインタラクションが決められているんですよね.例えば ConnectionManager
は ManagedConnectionFactory
から ManagedConnection
をもらってきて,ManagedConnection
からもらった XAResource
を TransactionManager
からもらった Transaction
に enlistResource()
して最後に ManagedConnection
からもらったコネクション (Object
型) を返すとか.
で,昨日までは例えば ConnectionManager
実装クラスをテストするのに ManagedConnectionFactory
実装クラスを継承した匿名クラスや内部クラスを使って都合のいいように振る舞わせていたのですが,これだとテストクラスがいろいろな実装クラスを使いまくることになるのがちょっとなんだかなーで,どっかバグるとみんな動かなくなったりみたいなのも悩みどころだったのです.
そんなわけで (どんなわけで?),EasyMock を使ってテストを書き換えてみたら,随分とすっきり♪
JCA 実装クラスの多くって,collaborator への参照以外にフィールドがほとんどなくて,「状態中心のテスト」がやりにくかったのですが,なるほど「相互作用中心のテスト」で考えればよかったのね.勉強になりました.
本当に単体テストになっちゃって,なんとなく結合テストを兼ねていたのがなくなってしまうので別途明示的に結合テストが必要だなぁって感じですが,しばらく使ってみることにします.
ってことは,S2Axis のあの辺りでもこれが使えるのだろうか?
...
うーみゅ,あいつはスーパークラス (Axis が提供するクラス) と相互作用するテストをしたいんだよなぁ.つまり,スーパークラスをモックに置き換えたいんだよなぁ.さすがにそれは無理だなぁ.Generics で extends T
ができればそういうテストもやりやすくなるんだけどなぁ.っていうかそこまでするくらいならサブクラスから処理を外に出せってことですかそうですか.
っていうか Axis 1.2Final が遂にリリースされたっぽい.ML でアナウンスが流れてます.JCA は中断して S2Axis するか...