バイトの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効かないことがわかりました。 悲しい。