こんにちは、開発担当の Masa です。

Java のユニットテストに Spock を使用していますが、Junit + Spock だけでは対応しきれなくなったので JMockit を導入しました。

これまでは Matcher や MatcherAssert を自作したり、Spock のモックを使用したりして何とか凌いで来ましたが、
new Date()」コレだけは歯が立ちませんでした。

テストのためだけに現在日付を生成する部分を外部から置き換え可能にするとか嫌なので、JMockit(jmockit-1.45.jar)を使うことにしました。

使い方は簡単です。

def "システム時刻を意のままに操る" () {
    setup:
    new MockUp<System> () {
        @Mock
        long currentTimeMillis() {
            1544883673460L
        }
    }
    
    expect:
    new Date().time == 1544883673460L
}

実行する場合は -javaagent オプションで jar を指定しないとダメだったので、
eclipse から直接テストクラスを実行する場合は、「実行の構成」「VM引数」に「-javaagent:パス/jmockit-1.45.jar」を追加しました。
Gradle、ant から実行する場合は、ビルドスクリプト・ビルドファイルにそれぞれ設定を追加します(参考サイトが多数あるので割愛)。

どの方法でも、クラスパスの指定で Junit よりも JMockit を先にすることが重要です。