2013-06-21 2 views
5

Javaコードの一部として、明日JUnitでいくつかのタスクを実行する必要があります。 - タスク2 JUnitテストフィクスチャの時間と日付を設定する

  • 行わ - 明日
  • TASK3をそれを行う - これが
  • が起こるのだろうだから、要件ごとに私がする必要がある

    • タスク1:

      例えば3つのタスクがあります明日の今日の日付をJavaで設定します。

    +0

    ユニットテストのソースを教えてもらえますか? – tbsalling

    +0

    私はフレームワークを使う必要はありません.iは3つのメソッド呼び出しのように3つのタスクしか持っていません.f1() - > f2() - > f3()。明日f2を行うことができ、結果f3が呼び出される。 – hi5

    +0

    +1stackoverflow.com/questions/10652097/simulating-thepassing-of-time-in-unittesting – Raedwald

    答えて

    5

    キーは「現在の時間を与えることができるもの」という考えを依存関係として抽出することです。 (該当するタイムゾーンと一緒に)

    new Date()またはSystem.currentTimeMillis()の代わりにClock抽象化を使用します。プロダクションコードの場合は、基礎となるシステムクロックを使用するインスタンスをインジェクトしますが、テストのために、明示的に制御できる擬似時計を使用して、必要なものを返すようにします。

    (それは本当に正確にクリアしていないあなたが達成しようとしているものを、正直に言うと - 。しかし、このアプローチはテスト可能な時間を作るに私の標準的なアプローチである)

    9

    あなたの問題の根本は、システムクロックということです( new Date()であなたに時間を与えるもの)は、あなたがあなたのテストに必要な時間を与えていません。

    この問題は、間接的なレベルを導入することで回避できます。 Java APIに現在の時刻を直接問い合わせるのではなく、Clockオブジェクトに時間を問い合わせてください。実際のプログラムでは、Clock実装でシステムクロックが使用されます。単体テストでは、いつでも好きな時間を言うFakeClockを使用します。どのようなClock依存性注入を使用して使用するコードを教えてください。 Clockインターフェース(または抽象基底クラス)と具体的な実装を自分で記述する必要があります。

    このアプローチでは、既存のコードを変更する必要があるため、テストしやすくするか、テストしやすくするために最初に書きます。単体テストの術の一つです。

    私は時間を敏感にしている現在、いくつかのコードに取り組んでいます。 DateSupplier & & DateController:私のクロック・インタフェースは、単に

    public interface Clock { 
        long getCurrentTime(); 
    } 
    
    3

    は、GitHubの上で次のコードを考えてみましょうです。 DateSupplierには、現在の日付を返す静的メソッドがあります。 DateControllerを使用すると、テスト環境でDateSupplierによって返される日付の値を操作できます。それはJUnit Ruleであり、それ自体の後でクリーンアップします。

    これは、他の2つの回答からのClockアイデアの具体的な実装です。私は自分のプロジェクトで1年ほどそれを成功裏に使ってきました。 new Date()を行うコードがあるときはいつでも、私はDateSupplier.getCurrentDate()を呼び出します。

    2

    Joda Timeを使用することを検討してください。これは、Javaの日付と時刻のクラスを置き換えるものです。あなたのテストに使用できる

    DateTimeUtils.setCurrentMillisFixed(long millis); 
    

    を提供します。

    +0

    +1も参照してください。私は時間限定のトライアル版を設定していて、時間についてSO答えでJoda時間を見続ける。これがジョーダタイムに価値ある変化をもたらした問題でした。それをインストールし、使用するためにコードを変更し、この提案でテストをセットアップするのに1時間もかかりませんでした。 –

    +0

    呼び出しは 'DateTimeUtils.setCurrentMillisFixed(...)'でなければなりません。これは特定の日付時刻を設定するための呼び出しです。 'DateTimeUtils.setCurrentMillisSystem()'(パラメータなし)は現在のシステム時刻を使用するようにDateTimeを設定します。 http://www.joda.org/joda-time/apidocs/index.htmlを参照してください。 –

    関連する問題