2016-11-30 9 views
0

私のコードにTimerTaskが実装されています。定期的にアプリケーションロジックを変更します。今、JUnitを使ってこのTimerTaskの影響をテストしたいと思います。 TimerTaskは2秒ごとに実行される予定ですが、Thread.sleepを使用せずにテストケースを実行する必要があります。JUnit Thread.sleepを使用せずにスケジュールされた影響のロジックをテストします。

public class LogService { 

    public LogService() { 
     configuration = ConfigurationUtil.getConfgiration(); 
     Timer timer = new Timer(true); 
     timer.scheduleAtFixedRate(new ScheduledAgent(), 0, configuration.getWaitTime()); 
    } 

    private List<LoggingDetails> loggingDetails; 

    public List<LoggingDetails> getLoggers() { 
     return loggingDetails; 

    } 

    class ScheduledAgent extends TimerTask { 

     @Override 
     public void run() { 
      // if time has taken more than wait time, then clear loggingDetails 

     } 
    } 
} 

単体テストのシナリオは、waitTime時間内にloggingDetailsを取得することです。これは実装可能です。もう1つのシナリオは、待ち時間の後にリストがクリーンでヌルであることをテストして確認することです。

+1

私はあなたのニーズが何であるかについてもっと詳しく知っておくべきだと思いますが、[JMockit](http://jmockit.org)を見てみるといいでしょう。これは 'Thread.sleep'や現在の時刻を返すメソッド – ajb

答えて

1

あなたのケースでは、LogServiceScheduledAgentの単体テストを分離します。

したがって、ScheduledAgentの実際のロジックをテストできます。

別のケースは、LogServiceのためのテストであなたはscheduleAtFixedRate方法が正しいパラメータと呼ばたことを確認しなければならないということです。そのためには、JMockitまたはPowerMockitoのようなライブラリを使用できます。ほとんどの場合、模擬する可能性を達成するために、timerをクラスのフィールドにする必要があります。私の見地からは、scheduleAtFixedRateメソッドがTimerTaskというメソッドを呼び出していることを定期的にテストする必要はありません。なぜなら、このメソッドはJDKのものであり、数千の開発者が既にテストしているからです。

関連する問題