2013-06-18 3 views
1

Мне нужно проверить InterruptedException и ExecutionException и написать JUnits для этого же.JUnit for future.get() Исключение сценария

Прошу совета по этому вопросу. Как я могу прерывать потоки для репликации сценария. populateDataForm запустит новые потоки и добавит это в список фьючерсов.

Вот мой пример кода:

class MyTest{ 
    public populateData(){ 

    Collection<Future<?>> futures = new LinkedList<Future<?>>(); 
    DataSet ds = Helper.populateDataForm(employee, futures); 

    waitForTaskCompletion(futures); 
    } 


    private waitForTaskCompletion(futures){ 
    for (Future<?> future:futures) { 
     try { 
       future.get(); 
      } catch (InterruptedException e) { 
       throw new CustomExcpetion("Message1", e) 
      } catch (ExecutionException e) { 
       throw new CustomExcpetion("Message2", e) 
     } 

    } 
} 

ответ

1

Вы можете наследовать от MyTest и перегрузки populateData() следующим способом:

public void populateData() { 

    ExecutorService executorService = Executors.newSingleThreadExecutor(); 
    Callable<String> calls = new Callable<String>() { 

     @Override 
     public String call() throws Exception { 
      for (;;){ 
       Thread.sleep(100); 
       // You call interrupt here, which causes Future.get() interrupt 
       Thread.currentThread().interrupt(); 
       if (1 > 2) break; 
      } 
      return null; 
     } 
    }; 
    final Future<String> future = executorService.submit(calls); 

    waitForTaskCompletion(future); 
    executorService.shutdown(); 
} 

Чтобы проверить ExecutionException бросок RuntimeException вместо прерывания следующим образом:

if (1==1)throw new RuntimeException(); 
+0

Thanks Sqeezer for совет. Он отлично работал для генерации сценария ExecutionException, но я не мог получить одно и то же сообщение об исключении для InterruptedException, когда писал JUnit с @Rule. – Sameer

+0

Для тестирования сценария InterruptedException с помощью @Rule нам необходимо прервать поток, выполняющий метод populateData(). Итак, после вызова метода populateData() из моего тестового класса, я прервал текущий поток с помощью Thread.currentThread(). Interrupt(). Поскольку тот же поток, который запускает TestMethod, запускает метод populateData(), и прерывания этого потока достаточно. – Sameer