0

リスト内のデバイス数に応じてapiが2回以上呼び出されるエグゼキュータサービスを含むコード実行をユニットテストしようとしています。私がコンソールから単体テストしようとすると、Mockitoの検証で、デバイスのリストを渡している間にApiが一度だけ呼び出されるというエラーが返されません。しかし、intellijでデバッグすると、正しく動作し、リストのデバイス数に応じて実行され、検証されます。続きMockito ExecutorServiceで実行したときの「回数」が実際のものより少ないかどうかを確認する

コード

final ExecutorService executor = new ThreadPoolExecutor(MAX_THREADS, 
    TimeUnit.MILLISECONDS, 
    new LinkedBlockingQueue<Runnable>()); 

DeviceList.stream().forEach(device -> executor.execute(() -> 
    GatewayToTest.deliver(device, id, testObject))); 

ユニットテストコードです:上記のコードで

verify(GatewayToTest, times(devices.size())) 
    .deliver(any(Device.class), anyString(), any(TestObject.class)); 

私はコンソールでユニットテストを実行すると、GatewayToTestは一度だけ呼ばれます。

+1

(https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ Executor.html#execute-java.lang.Runnable-)、タスクは*将来の*実行されます。ユニットテストは、いくつかのタスクがまだ完了していないときに '検証 'しようとしています。 [This](https://stackoverflow.com/questions/1250643/how-to-wait-for-all-threads-to-finish-using-executorservice)が役に立ちます。 –

答えて

3

実行は非同期に実行されるため、GatewayToTest.deliverへのすべての呼び出しがverifyより前に発生することを保証することはできません。 実行するためのタスクを提出した後終了を待つようにしてください:[API]に基づいて

executor.awaitTermination(10,TimeUnit.SECONDS); 
+0

ありがとうございます。私は最終的に実際のコードでawaitTerminationとシャットダウンを終了し、単体テストでもThread.Sleepを追加しました –

関連する問題