2016-05-20 5 views
5

私は、特定のメッセージを送信すると、サーバーが設定された時間枠内で応答しないと予想するTCPソケットを介して通信のテストを行っています。予想されるタイムアウトのJUnitテスト

サーバーの動作は制御できません。

設定された時間枠内に完了していないと、テストに失敗することがあります。しかし、どのように私は反対を行うことができます、それは時間枠内で完了しないために合格する?

@Test (timeout=1000)を使用して、1秒以内に完了しなければテストに失敗することがあります。

しかし、Junit 4を使用すると、予想されるタイムアウトを肯定的な結果としてテストする機能がありますか?私。テストは時間枠内で完了すれば失敗し、そうでない場合は合格となりますか?

+0

はタイムアウトが例外をスローしていますか?存在する場合は、そのタイムアウト例外をテストできます。 – Compass

+0

これに注意してください。私は 'timeout'によってスローされた例外を' expect'できないと思います。タイマーを使用するか、操作の時間を確認して、希望の時間を過ぎた場合は、予期しない例外を投げることができます。しかし、非常に効率的ではないようです。 – Zircon

+2

また、テストの目的は何ですか?サーバーの下流にコードのスコープから外れている場合、私はあなたの目的をテストすることがどれほど有益なのかよく分かりません。あなたのコードがタイムアウトを処理することを期待している場合は、ソケットをモックして例外をスローするだけです。 – Compass

答えて

4

良い質問です。実際にはjunitツールのみを使用してこれを行うことができます。私の考えは、Timeoutルールの動作+ expected属性をTest注釈の逆にすることです。唯一の制限:Ruleは、その内部のすべてのテストに適用されますので、あなたが、別のクラスでテストを配置する必要があります。

public class Q37355035 { 

    private static final int MIN_TIMEOUT = 100; 

    @Rule 
    public Timeout timeout = new Timeout(MIN_TIMEOUT) { 
     public Statement apply(Statement base, Description description) { 
      return new FailOnTimeout(base, MIN_TIMEOUT) { 
       @Override 
       public void evaluate() throws Throwable { 
        try { 
         super.evaluate(); 
         throw new TimeoutException(); 
        } catch (Exception e) {} 
       } 
      }; 
     } 
    }; 

    @Test(expected = TimeoutException.class) 
    public void givesTimeout() throws InterruptedException { 
     Thread.sleep(1000); 
    } 
} 
関連する問題