Junit: метод получения CompletableFuture<ExecutionResult> никогда не возвращается

В моем загрузочном приложении 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 помогает мне с вышеуказанной проблемой.

вы не вызываете свой метод1. что вы ожидали, что произойдет? также: почему вы делаете инъекцию своего класса Entry?

Stultuske 14.03.2019 13:38

Вы ждете, пока ваш CompleteableFuture завершит использование get. Если он никогда не возвращается, логическим следствием является то, что он никогда не завершается. Возможно, вы захотите это проверить.

Ben 14.03.2019 13:40

Привет @Stultuske обновил код, извините, я пропустил вызов метода.

Amit 14.03.2019 13:42

Hhi @Ben, я издеваюсь над всем вызовом, так как я могу проверить логические последствия, пожалуйста, предложите.

Amit 14.03.2019 13:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
1 636
1

Ответы 1

Вы издеваетесь над 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());
    }
    

Другие вопросы по теме