ForkJoinPool を使用して REST サービスへの非同期呼び出しをチェックするいくつかのテストを作成したいと考えています。次のコードがあります。
final ForkJoinTask<List<Something>> someJoinTask1 = new RecursiveTaskLambda<>(
() -> service1.findAll(filter));
this.forkJoinPool.execute(someJoinTask);
final ForkJoinTask<List<Something>> someJoinTask2 = new RecursiveTaskLambda<>(
() -> service2.findAll(filter));
this.forkJoinPool.execute(someJoinTask);
// some stuff happening here
try {
firstList= someJoinTask1.get();
secondList = someJoinTask2.get();
}
catch (final InterruptedException | ExecutionException e) {
throw new MyException("Couldn't load mandatory data for screen", e);
}
getView().setSomething1(firstList);
getView().setSomething2(secondList);
私のテストでは、次のコードがあります。
//prepare some stuff for the test
Mockito.when(this.service1.findAll(Matchers.any(MyFilter.class))).thenReturn(someStuff);
// ----Call tested method----
someMethod();
Mockito.verify(this.view).setSomething1(captor.capture());
Mockito.verify(this.view).setSomething2(captor.capture());
// ----Asserts----
問題は、テストを実行すると永遠に実行されることです。Thread.sleep() を追加して、それが変わるかどうかを確認しようとしましたが、そうではありません。テストをデバッグしようとすると、すべての準備コードがテストされたメソッドを呼び出し、到達するfirstList= someJoinTask1.get();とsomeMethod();ハングします。
これは私のスレッド ダンプです (必要かどうかはわかりません)。
"main@1" prio=5 tid=0x1 nid=NA waiting
java.lang.Thread.State: WAITING
at java.lang.Object.wait(Object.java:-1)
at java.util.concurrent.ForkJoinTask.externalInterruptibleAwaitDone(ForkJoinTask.java:367)
at java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:1001)
at someMethod(the first get line)
私はTestNgとMockitoを使用しています