S2GroovySeasarでMockInterceptor
MockInterceptorの本来の使い方からはずれてるけど、Debugのときなどで便利なことあるかな?
new SeasarBuilder().components(){ component(class: TraceInterceptor, name: "traceInterceptor") component(class: study.seasar.Hoge) { aspect(advice: "traceInterceptor") aspect(advice: { m = new MockInterceptor() m.setReturnValue("hoge", "ABC") m.setReturnValue("foo", 123) return m.invoke(it)}) } }
利点
- Test対象のコンポーネントとMockの対応関係がわかりやすくて見やすい。
欠点
- コンテナに登録できないのでTestコードからMockInterceptorにアクセスできない。
- チェック例外をセットしてもGroovyRuntimeExceptionに置き換えられてしまう。GroovyのClosureの中からMockInterceptorにアクセスしているので。
- じつはMockInterceptor使わなくてもpointcut指定とclosureで同様のことできる。
欠点多い…
そもそも何でこんな無駄っぽいことを考えてしまったかというと、Testコードで使いたいのはMockInterceptorでなくてあくまでMockなのだからMockInterceptorをコンテナ登録しなくていいんじゃないかと思ったからでした。そして、コンテナ登録いらないなら見やすいほうがいい、と。Test対象はMockでなくてMockを使用するクラスなのだから、そのTest対象クラスの挙動が正しければ問題ないわけで、Mockの呼び出しが正しくおこなれたかどうかまでチェックするのは細かすぎるのではと思ったのです。
でも逆になぜMockの呼び出しが正しくおこなれたかどうかをMockInterceptorを使ってTestする必要があるかといえば、インタフェースで疎結合されたクラス同士ではそのインタフェース(結合点)が一番重要だから、ということでしょうか?