2011-09-22 2 views
2

私は以下のようなjavaクラスを持っています。ファイルのサイズが一定の間隔で変更されない場合、アラートが生成されます。run()に無限ループを持つRunnable JavaクラスのUTを書くには?

私は2つのUTを書きたいと思っています。

1.ファイルサイズを変更しないでください。

2.Simulateファイルサイズはしばらくの間変更されます。その後、ファイルサイズが変更されます。

UTは、条件が満たされているかどうかにかかわらず、alerter.alert()またはalerter.harmless()が実際に呼び出されることを確認します。私はAlerterを嘲笑し、それをTaskのコンストラクタに渡した。しかし、run()のタイミングを制御する方法は?私はマルチスレッドのタイミングを正確に制御することはできません知っている。私はちょうどこの種のクラスのためにutを書くのがベストプラクティスであることを知りたいです。可能であれば、試験サンプルを記入してください。

特定のファイルのサイズが一定の間隔で変化するかどうかを確認するために、「some condition」と見なすことができます。変更されていない場合、いくつかの条件が成り立ちます。

class Task implements Runnable{ 
    Alerter alerter; 
    boolean stop=false; 
    public Task(Alerter alerter){ 
     this.alerter=alerter; 
    } 
    public void run() { 
     while (!stop){ 

      if (some condition){ 
       alerter.alert(); 
      } else{ 
       alerter.harmless(); 
      } 

      Thread.sleep(5000); 

     } 
    } 
    public synchronized void stop(){ 
     stop=true; 
    } 

} 

私は以下のようにutを書くことを考えています。しかし、私はそれが十分だとは思わない。

@Test 
public void testRunWithFeed() { 
    Alerter mockAlerter=mock(Alerter.class); 
    Task task=new Task(mockAlerter); 
    Thread thread =new Thread(task); 
    thread.start(); 
    try { 
     Thread.sleep(1000); // give Task.run() a change to run 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    task.stop(); 
    try { 
     thread.join(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    verify(mockAlerter,atLeastOnce()).alert(); 
    verify(mockAlerter,never()).harmless(); 

} 

@Test 
public void testRunNoFeed() { 
    Alerter mockAlerter=mock(Alerter.class); 
    Task task=new Task(mockAlerter); 
    Thread thread =new Thread(task); 
    thread.start(); 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    changeFileSize(); 
    try { 
     Thread.sleep(6000); //because every 5000ms file size will be checked once in run() 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

    task.stop(); 
    try { 
     thread.join(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    verify(mockAlerter,atLeastOnce()).alert(); 
    verify(mockAlerter,atLeastOnce()).harmless(); 

} 

ありがとうございます。

答えて

1

私はあなたがsleep()を呼び出すべきではないと思うし、明らかにあなたのテストでstopを呼び出すべきではないと思います。 タスクを実行して終了すると予想される場合、join()の呼び出しで十分です。メインスレッドは、ワーカースレッドが完了するまで待機します。次に結果を確認します。

さらに別のヒント。あなたは、あなたのテストが止まらないようにすべきです。 JUnitとTestNGの両方にテストタイムアウトを定義する注釈があります。 timeoutが期限切れになると、テストはフレームワークによって強制終了され、自動的に失敗します。

たとえば、JUnitの場合、属性はtimoutです。@Test(timeout=3000)は3秒を意味します。

+0

AlexRありがとうございます。しかし、他のスレッドがstop()メソッドを呼び出さない限り、Task.run()は無限になります。私がsleep()を呼び出す理由は、Task.run()にwhileループを実行するチャンスを与えたいということです。 「ある条件」は、指定されたファイルのサイズが一定の間隔で変化するかどうかをチェックするものとみなすことができます。変更されていない場合、いくつかの条件が成り立ちます。 – Smartmarkey

+0

私は自分の質問を更新しました。私は今、それがはっきりしていると思う。 – Smartmarkey

関連する問題