バイトのtestで、Spockでさらっとtest書いて、
いざ全pattern cross check! と思ったら、
無限loopになるpatternが多くて。
@Timeout
導入でサクッと、と思ったら、
loop回るのが早くて凄いmemoryと時間を食って、
@Timeout
では抑えきれません。
うーむ、それじゃぁGroovyのmetaClassでmethodの振る舞いを変更だ!
と思ったら、どうやっても振る舞いが変わりません。
悩んだ末、GroovyのmetaClassでの再定義は、
外側のJava classには及ばない(Groovyの世界の中だけ)、と結論。
仕方無いじゃぁJMockitだ!
って思ったんですが、今度はSpockとJMockitは相容れないようで、
1
|
|
なのでJAVA_OPTS=-javaagent:.../jmockit-1.37.jar
をつけて実行すると今度は、
1
|
|
spockは諦めました。
ならばせめてJUnit5だ! と思ったんですが、build.gradle
で、
1
|
|
と指定しているので、敢え無く撃沈。 調べるとどうも、JUnit5とAntを組み合わせる動きはないんですよね。 それでも Ant を使いたい人のための JUnit 5というのもありましたけど、これは、
1
|
|
で無理矢理実行してるだけですから、ちょっと違います。
こちとら、build.gradle
からant.junitAnt(...)
で呼んでいるので、
ConsoleLauncher
だと困るんです(→どうやって書いたらいいかよくわからない)。
結局、JUnit4 + JMockit で書きました。
Timeout
やExpectedException
は@Rule
にしてちょこっと今っぽくしましたけど、
そのくらいが関の山でした。
ant.junitAnt(...)
でfork:true
にして、また更に
junit4.jar
よりjmockit.jar
を先に書いておかないと
IllegalStateException
が出る(gradle + jmockitでjava.lang.IllegalStateExceptionって出たので対応)、
というのでそう書いたしgradle --stacktrace
してload順確認したんですけど、
それでもException出たので、
1
|
|
を入れて漸く動きました。
けど、折角JMockit入れたのに、
やっぱり別の時にはTimeout
も必要で。
JUnit4だと@Rule
つけてTimeout.millis(200)
でいいんですね今。
そしたら、JMockitで振る舞い変えなくても、
GroovyでなくJavaならTimeout
だけで済むじゃーないですかー!
うぁーん。
あとはParameterized Testにしました。 JUnitParamsが簡便そうです。 何がいいって、JUnit4標準の方法だとinstance fieldがparameterになるので、 全methodについて回っちゃいませんか? というのが不安で。 JUnitParamsなら、明示的に単一methodに対してparameter指定できるので安心です。
...ダメです。JUnitParams使うと、Timeout効かないことがわかりました。 悲しい。