Не выполняется запрос к API в потоках (Threads)

Пытаюсь сделать тест, имитация работы 2х пользователей над док-м. Использую библиотеки RestAssured и JerseyTest. Делаю задание на выполнение запроса к API сервиса, помещаю задание в потоки, но при прохождении теста в Thread запрос почему то не выполняется, если выполнять без потоков, то все ок. Думал проблема в библиотеках, подключил Jersey, но не помогло. Может кто сталкивался с такой проблемой ?

@Test
@DisplayName( "test" )
void changeState() {
    try {

        Runnable task = () -> {

            logger.debug( "start" );
            
            Response response = RestAssured.get( "https://api.github.com/users/eugenp" );
            
            logger.debug( "stop" );
            
        };

        Executor executor = ( runnable) -> {
            new Thread(runnable).start();
        };
        executor.execute(task);
        executor.execute(task);

    } catch( SQLException e  ) {
        Assertions.fail(e);
    } 

}  

Ответы (1 шт):

Автор решения: Roman Konoval

Тут есть две проблемы:

  1. главный поток (тот в котором выполняется метод changeState ) не ждет, когда завершатся дополнительные потоки
  2. информация о успешности/неуспешности действий в дополнительных потоках не передается и не анализируется основным потоком (т.е. если произойдет любая ошибка и исключение во время выполнения запроса - основной поток об этом никак не узнает, исключение просто привет к тому, что дополнительный поток тихо прекратит свою работу).

Простой способ это исправить это воспользоваться встроенными в java средствами для запуска потоков, а именно ExecutorService:

Callable<Boolean> task = () -> {
   logger.debug( "start" );
   Response response = RestAssured.get( "https://api.github.com/users/eugenp" );
   logger.debug( "stop" );
   return true;
};

ExecutorService executor = Executors.newFixedThreadPool(5);

Future<String> future1 = executor.submit(task);
Future<String> future2 = executor.submit(task);

// get дождется конца выполнения task
// Если случится исключение во время выполнения задачи, то get
// бросит ExecutionException 
future1.get();  
future2.get(); 
→ Ссылка