ではなく、submit()
とお考えですか? (私の応答の一番下を参照してください)
MoreExecutors.listeningDecorator
(参照のラッパーの種類)からListeningExecutorService
を入力すると、あなたは不運です。 listeningDecorator
は、ほとんどのExecutorService
の実装と同様に、FutureTask
の中のすべての入力をsubmit
にラップします。この問題の通常の解決方法は、AbstractExecutorService
を実装し、newTaskFor
をオーバーライドしてカスタムオブジェクトを返すことです。それもここでもうまくいくはずです。あなたは基本的にlisteningDecorator
を再実装するでしょう。それはAbstractListeningExecutorService
のまったく些細なラッパーです。それ自体はAbstractExecutorService
のまったく小さなラッパーです。
2つの合併症が2つあります。 (OK、もっとあるかもしれません。私は私が示唆していたアプローチをテストしていないことを認める。)
AbstractListeningExecutorService
あなたがnewTaskFor
を上書きすることはできません。 (なぜ?あなたがfile a feature requestを望むかどうか説明することができます)その結果、はAbstractExecutorService
を直接に拡張し、(短い)AbstractListeningExecutorService
の実装を大部分は複製する必要があります。
newTaskFor
ListenableFuture
も返さなければならず、それもComparable
です。 ListenableFuture
の具体的な選択はListenableFutureTask
ですが、そのクラスはfinal
であるため、インスタンスを作成することはできません。Comparable
解決方法はとを作成して、を実装するSimpleForwardingListenableFuture
に置きます。
なぜ私はあなたがsubmit()
はなくを扱っていると仮定していますか?
public void testListeningDecorator_noWrapExecuteTask() {
ExecutorService delegate = mock(ExecutorService.class);
ListeningExecutorService service = listeningDecorator(delegate);
Runnable task = new Runnable() {
@Override
public void run() {}
};
service.execute(task);
verify(delegate).execute(task);
}
を:私はちょうど書いた本試験で示されているよう
listeningDecorator(...).execute()
は、入力タスクをラップしません。