torutkのブログ

ソフトウェア・エンジニアのブログ

テストしやすいメソッド設計

メソッドの中で、System.currentTimeMillis()のような実行タイミングに依存する結果をもたらす処理が入っていると、テストケースが書きずらいものになります。

public static long getCurrentNtpTime() {
    long currentUnixTime = System.currentTimeMillis();
    ...
    return ret;
}

この場合、実行する時間が厳密に一致しない限り戻り値が変化してしまい、テストケースが記述できません(事実上できない)。

一方、メソッドを分割し、実行タイミングに依存する部分が下記のように切り出されていれば

public static long getCurrentNtpTime() {
    return getNtpTime(System.currentTimeMillis());
}

public static long getNtpTime(long time) {
    ...
    return ret;
}

テストケースをgetNtpTime(long)メソッドに対して実行することができるので、実行タイミングに依存せずにテストを記述することができます。

テストファーストで作成していれば、このような問題は自然と回避できるのですが、テストを後付けで作成すると、往々にしてこの問題に直面することになります。