0

テストしたいメソッドの実装があります。

    @Override
public void onMessage(final Message message) {
    try {
        LOG.fine("waiting on semaphore for " + message);
        semaphore.acquire();
        LOG.fine("semaphore acquired for " + message);
        listener.onMessage(message);
        LOG.fine(message + " processed");
    } catch (final InterruptedException e) {
        throw new RuntimeException(e);
    } finally {
        semaphore.release();
    }
}

ただし、JUnit テストから InterruptedException をトリガーする方法がわかりません。理論的には、フックを追加してそれを終了させることができますが、それは回避したいテストにのみ使用されるコードでコードベースを汚染します。

4

2 に答える 2

1

セマフォをモックする必要があります。偽造されたセマフォは InterruptedException をスローする必要があります

于 2012-06-03T19:31:15.360 に答える
0

私のテストでは、onMessage を呼び出す前に現在のスレッドを中断すると、ブロックする必要がなくても acquire メソッドがスローされますが、それがすべての jres で発生するかどうかはわかりません。

もう 1 つのオプションは、これに複数のスレッドを使用することです。スレッド 1 で onMessage を呼び出し、そのリスナーでスレッド 2 に onMessage を呼び出してスレッド 2 が完了するまでブロックするように通知します。スレッド 1 がセマフォをロックするまで、スレッド 2 をブロックします。次に、それ自体を中断して onMessage を呼び出す必要があります。予想される実行時例外を取得したら、ブロックを停止するようにスレッド 1 に通知する必要があります。

2 つのスレッドを通信させるには、2 つの CountDownLatches を使用します。

テストが失敗した場合は、両方のスレッドを必ず終了してください。

于 2012-06-04T13:38:05.150 に答える