2016-10-22 9 views
2

Это первый раз, я пытаюсь написать JUnit для многопоточной Java-программы.Как проверить метод, который создает отдельный поток?

У меня есть метод, который выглядит ниже, Можете ли вы предложить, как я могу написать JUnit для этого? или указать на такие подобные примеры? Большое спасибо в Advance ... !!

public void myMethod(Input input) { 
    if (!this.isStreamingPaused()) { 
     ExecutorService publisherThreadPool = getThreadPool(); 
     PublisherThread publisher = new PublisherThread(); 
     publisher.setInputData(input); 
     publisherThreadPool.execute(publisher); 
     publisherThreadPool.shutdown(); 
    } 
} 

public ExecutorService getThreadPool() { 
     final ThreadFactory threadFactory = new BasicThreadFactory.Builder() 
       .namingPattern("MyName-%d") 
       .priority(Thread.NORM_PRIORITY) 
       .build(); 
     return Executors.newFixedThreadPool(1, threadFactory); 
} 
+1

Отдельные ваши проблемы. Как следует из названия, модульные тесты должны ориентироваться на единицы функциональности. Попробуйте один тест для класса, который порождает поток, и второй тест для самого класса потоков. – EJK

+0

Спасибо EJK за ответ. Я собираюсь написать отдельный junit для основной функциональности в потоке PublisherThread, но я обеспокоен тем, что, как я могу проверить, что блок кода внутри myMethod, который генерирует поток? – user3452558

+0

Обратите внимание, что создание пула потоков подобно этому означает, что вы не можете выполнить 'myMethod' более одного раза. Вы также можете проверить, закрыт ли исполнитель, а также создать новый экземпляр в этом случае. –

ответ

1

Вы можете попробовать использовать java.util.concurrent.CountDownLatch

public void myMethod(Input input) { 
    if (!this.isStreamingPaused()) { 
     ExecutorService publisherThreadPool = getThreadPool(); 

     // in case that you'd have more of the same kind of operations to do 
     // you can use appropriately a higher count than 1 
     CountDownLatch latch = new CountDownLatch(1); 

     PublisherThread publisher = new PublisherThread(); 
     publisher.setInputData(input); 
     publisherThreadPool.execute(publisher); 
     publisherThreadPool.shutdown(); 


     try { 
      latch.await(); 
     } catch (InterruptedException e) { 
      LOG.info("Interrupted by another thread"); 
     } 
    } 
} 

В вашем PublisherThread классе вы делаете эти изменения:

private CountDownLatch latch; 

public PublisherThread(CountDownLatch latch){ 
    this.latch = latch; 
} 

public void run(){ 
    try{ 
     // kafka business logic 
     // .... 
    } finally { 
     // you don't want your program to hang in case of an exception 
     // in your business logic 
     latch.countDown(); 
    } 
}