В моем загрузочном приложении Spring у меня есть два метода: Я пишу JUnit для метода1 и издеваюсь над методом процессЗапрос(). но я не знаю, почему, когда управление достигает результат.получить() , оно застревает и не движется дальше.
Method 1:
public class Entry(){
public string method1(){
--some process and then calling method 2
CompletableFuture<ExecutionResult> result =
risk.processQuery(graphQLRequest, context);
**result.get();** **--Control got stuck here**
system.out.println("control not reaching here ");
}
}
**TestClass ::**
public class testMain(){
@InjectMock
Entry entry;
@Mock
Risk risk;
@Before
public void setup() {
entry= new Entry();
MockitoAnnotations.initMocks(this);
}
@Test
public void testMethod1(){
CompletableFuture<ExecutionResult> result = new
CompletableFuture<ExecutionResult>();
Mockito.doReturn(result).when(risk).processQuery(Mockitt.anyString(),Mockito.any());
entry.method1();
}
Kinde помогает мне с вышеуказанной проблемой.
Вы ждете, пока ваш CompleteableFuture завершит использование get. Если он никогда не возвращается, логическим следствием является то, что он никогда не завершается. Возможно, вы захотите это проверить.
Привет @Stultuske обновил код, извините, я пропустил вызов метода.
Hhi @Ben, я издеваюсь над всем вызовом, так как я могу проверить логические последствия, пожалуйста, предложите.




Вы издеваетесь над risk.processQuery() незавершенным CompletableFuture
CompletableFuture<ExecutionResult> result = new CompletableFuture<ExecutionResult>();
Mockito.doReturn(result).when(risk).processQuery(Mockitt.anyString(),Mockito.any());
Когда вы вызываете get() для CompletableFuture, он ждет, пока не завершится со значением или исключением. Здесь ваше будущее никогда не завершено, поэтому оно ждет бесконечно долго.
Здесь у вас есть три решения:
определите свой макет так, чтобы он возвращал уже завершенное будущее:
CompletableFuture<ExecutionResult> result = CompletableFuture.completedFuture(someResult);
сделайте тестовый вызов entry.method1() в отдельном потоке (например, с CompletableFuture.supplyAsync()), а затем завершите результат с помощью result.complete(someResult) в тесте;
реорганизуйте свой код так, чтобы method1() также стал асинхронным, например:
public CompletableFuture<String> method1(){
--some process and then calling method 2
CompletableFuture<ExecutionResult> result =
risk.processQuery(graphQLRequest, context);
return result.thenApply(result -> result.toString());
}
затем адаптируйте свой тест для имитации асинхронного ответа:
@Test
public void testMethod1(){
CompletableFuture<ExecutionResult> result = new CompletableFuture<ExecutionResult>();
Mockito.doReturn(result).when(risk).processQuery(Mockitt.anyString(),Mockito.any());
CompletableFuture<String> method1Result = entry.method1();
result.complete(someResult);
assertEquals("some String", method1Result.join());
}
вы не вызываете свой метод1. что вы ожидали, что произойдет? также: почему вы делаете инъекцию своего класса Entry?