tokuhirom's Blog

Java で method_missing したい。

Java で method_missing したいというのは、テストを書いているときによくあるケースである。 Mockito など利用すればいいのだが、その中身が気になってしまうのが、エンジニアの性であろう。

そういうわけで、method_missing のやり方を調べていると、Proxy を利用する例が多々みつかる。 しかしこの方法では満足な結果は得られない。なぜならば Proxy では interface に対するモッキングはできるがクラスにたいするモッキングが出来ないからだ。悲しい。

参考: http://www.javaworld.com/article/2076233/java-se/explore-the-dynamic-proxy-api.html

そういうわけで、mocking には cglib or javassist などのバイトコード生成系ライブラリを利用するのが良い。 http://stackoverflow.com/questions/3291637/alternatives-to-java-lang-reflect-proxy-for-creating-proxies-of-abstract-classes


なお mockito の

when(body).thenReturn()

のような記法で、body がキャプチャできるわけないしキモいなあと思っていたのだが、これは単に DSL としてかっこ良く見せてるだけで、実際には引数としてなにかに利用しているわけではないようだ。つまり以下のように書いても同じなのだが、読みやすくするためにああなっている、ということのようだ。

body; when().thenReturn()