2010-11-24 8 views
2

のユニットテスト即時出口へ:どのユニットは、次のコードをテストする方法方法

 
@Override 
public void update() { 
    if (isStopped() || isPaused()) { 
    return; 
    } 
    // ... 
} 

この方法は、オーディオストリームからのものです。ストリームが新しいデータを読み込むように定期的に呼び出す必要があります。再生が停止または一時停止されている場合は、ストリームが進まずにすぐに戻ります。しかし、私はこのコードのテストを書く方法を見つけることができません。

+0

をそのメソッドは可視状態を変更しないよう私たちはより多くのコードを参照する必要があります - ので、インスタンス変数にはどのようなものがあり、isStoppedとisPausedには何がありますか? – Mark

+1

'// ...'が何をしても、それが起こっていないことを検証しますか? –

+0

ユニットテストの総カバレッジは達成するのが難しく、おそらく努力する価値はありません。ファンキーなやりとりが行われていない限り、これはあなたが「あまりにも硬い」バスケットに入れることができるケースのように見えます。 –

答えて

1

おそらく何が起こったのかを示すbooleanを返しますか?

1

この場合、メソッド呼び出しに副作用がないことをテストする必要があります。たとえば、...がコラボレーターのメソッド呼び出しを持っている場合は、そのコラボレーターをモックし、コラボレーターのメソッドが呼び出されていないことを確認する必要があります。

また、更新が呼び出されているオブジェクトのプロパティは、あなたのクラスに実際にあるものに応じて、変更されていないことをテストすることができるかもしれません....

0

ここでは、複雑なアプローチです:

1つのアイデアは、Observerパターンを実装し、テストされたクラスのイベントをサブスクライブできるリスナインタフェースを定義することです。このアプローチは、物事が今取り組んでいる途中に巨大侵入され、そしてもちろん

yourClass.addEventListener(new EventListener(){ 
    public void process(EventDetails details){ 
     if(EventType.UPDATE.equals(details.getEventType())){ 
      fail("Received update event"); 
     } 
    } 
}); 
// set to stopped or paused 
yourClass.update(); 
// if we got here, test has succeeded 

public interface EventListener{ 
    // EventDetails would be an object that encapsulates 
    // event type and extra data 
    void process(EventDetails type); 
} 


private void dispatchEvent(EventType type){ 
    for(EventListener listener : this.listeners){ 
     listener.process(new EventDetails(type 
      /* you'll want to add more data than that here */)); 
    } 
} 


@Override 
public void update() { 
    if (isStopped() || isPaused()) { 
    return; 
    } 
    dispatchEvent(EventType.UPDATE); 
    // ... 
} 

とテストクラス内:イベントは、このケースであればブロックの後に送信されますアプリケーションが実際にイベント通知システムを使用できるかどうかだけです(ユニットテスト機能は素晴らしい副作用です)。


または完全に別の何か:ユニットテストで

、もしブロックの後に呼ばれているものメソッドオーバーライドするサブクラスを使用します。

それでは、元のコードはこれですと言ってみましょう:

@Override 
public void update() { 
    if (isStopped() || isPaused()) { 
    return; 
    } 
    doUpdate(); 
} 

その後、サブクラスがdoUpdate()メソッドオーバーライドします:

protected void doUpdate(){ 
    fail("I shouldn't be here"); 
} 
関連する問題