Java で「現在年」が関係するクラスを書いていて、そのテストをどうやればいいかな?と思って調べていた。何も考えないで作っちゃうと「来年になったらテストがコケる」というアレを回避するヤツ。
実験的にクラスを作っていたときには Calerdar インスタンスをクラス内で生成していたけど、Calendar インスタンスの setter を用意してして、外部から注入可能なようにした。テスト時には、この setter を使って Mock を差し込めば良いはずだと考えて。
setter に思いを馳せていたときには、まだ Mock に何を使えばいいのか分からなかったのだが、検索してみると Mockito の名前をよく見かけた。更にそれを調査してみたら、なんか見たことのあるメソッド名が並んでいたので「おおっ!?」となった。
PHP では、Mock ライブラリに Phake をつかっているのだけど、Mockito はそれにそっくり。もう、少し調べてみると、その関係性は逆で、Phake のほうが Mockito の影響を受けて作られていたのだと分かった。
並べてみるとこんな感じ(動かしてない)。 FooClass
は別途どこかで import / use しているクラスだと思って読んでね。
import static org.mockito.Mockito;
FooClass mockedFoo = Mockito.mock(FooClass.class);
Mockito.when(mockedFoo.getValue()).thenReturn("dummyValue");
use \Phake;
$mockedFoo = Phake::mock(FooClass::class);
Phake::when($mockedFoo)->getValue()->thenReturn('dummyValue');
先日の日記に書いた「イマドキの PHP を書いていれば Java は比較的理解しやすいんだなぁと、いまさらながら思っている」という思いの要因が、またひとつ増えた気がする。
さて、もうちょっとテストを書かねば。境界値あたりのパターンを書いてなかったことを思い出してしまった。