2009-08-02 10 views
6

jUnit 4.5テストで現在時刻を操作する方法はありますか?私はそれが簡単にテストできるようにすること、私はユニットテストで現在時刻を操作しますか?

public String getLastWeek() { 
    GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone("Europe/Stockholm")); 
    c.setFirstDayOfWeek(GregorianCalendar.MONDAY); 
    c.add(GregorianCalendar.WEEK_OF_YEAR, -1); 
    return c.get(GregorianCalendar.YEAR) + " " + c.get(GregorianCalendar.WEEK_OF_YEAR); 
} 

一つの方法のためのユニットテストを持っているしたいのですが、以下の方法を持っている二つの方法

私はテストでき
public String getLastWeek() { 
    GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone("Europe/Stockholm")); 
    return getLastWeekFor(c); 
} 

public String getLastWeekFor(GregorianCalander c) { 
    c.setFirstDayOfWeek(GregorianCalendar.MONDAY); 
    c.add(GregorianCalendar.WEEK_OF_YEAR, -1); 
    return c.get(GregorianCalendar.YEAR) + " " + c.get(GregorianCalendar.WEEK_OF_YEAR); 
} 

にそれを分割することですgetLastWeekはテストされておらず、このためのメソッドは1つだけです。

+0

2つの異なるパラメータリストを使用した場合の1つの方法です。 – guerda

答えて

6

システム時間を実際に操作する方法はありません。

実際には、テスト可能にするために、メソッドをかなりうまくリファクタリングしました。私はそれを保つだろう。

3

ここには2つのパスがあります。

CalendarおよびDateのインスタンスを構成するファクトリクラスを作成します。DateUtilsファクトリクラスを作成します。次に、これを制御可能な工場に交換することができます。つまり、setCurrentTimeメソッドを公開するDateUtilsの2番目の実装があり、その時刻にCalendarインスタンスを明示的に返します。

また、JMockitを使用して実際にnew GregorianCalendarの呼び出しを「再定義」することができるので、代わりに模擬インスタンスが返されます。私はこれを自分でやったことはありませんが、説明はhereです。

この方法を2つの方法に分解するオプションも、完全に有効なオプションです。自分自身を含めてほとんどの人がやっていることだと思います。しかし、真実は、特にクラスが他のコードにさらされていると、あなたのデザインを傷つけることです。

+0

最初の2つの提案は、完全に有効であり、他の状況でも頻繁に使用されていますが、OPのニーズには多少の過労を感じます。 –

1

あなたが何を再作成しようとしているように見えますか。JODA時間はありません。あなたが気づいていない場合に備えて私はそれを引用します。ホイールの再構築と依存関係の追加の間にトレードオフを行うことができます。

+0

Actully私はJODAを今日早く見つけ、それが私がactullyが使用したかったものであることを認識しました。テスト可能なJODAのバージョンはどのように見えるでしょうか?それとも、JODAが正しいテストを行っていると仮定すればいいのですか? –

+0

JODAのソースを調べて、ユニットテスト済みかどうかを確認してください。私はそれが賭けている。通常、私は第三者図書館が私にそうでないと信じる理由が得られるまでテストされていると仮定します。最悪の場合、彼らはあなたよりも大きなユーザーベースを持っています。多くの人がコードを叩いていると、多くのエラーを見つけて修正する良い方法です。 – duffymo

関連する問題