2016-10-22 6 views
2

これは初めてですが、私はマルチスレッドJavaプログラム用のJUnitを作成しようとしています。別のスレッドを作成するメソッドをテストするには?

私は以下のような方法があります。どうすればJUnitを書くことができますか?そのような似たような例を指していますか?アドバンスでおかげさまで... !!

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

セパレートあなたの懸念を。この名前が示すように、単体テストは機能単位を対象とする必要があります。スレッドを生成するクラスに対して1つのテストを行い、スレッドクラス自体に対して2つ目のテストを試してください。 – EJK

+0

EJKに返信してくれてありがとう。私はPublisherThreadスレッドの主な機能のために別々のjunitを書くつもりですが、私はここでどのようにテストできますか、スレッドを生成しているmyMethodのコードブロックを懸念していますか? – user3452558

+0

このようにスレッドプールを作成すると、 'myMethod'を複数回実行できないことに注意してください。エグゼキュータがシャットダウンされているかどうかをチェックし、その場合は新しいインスタンスを作成することもできます。 –

答えて

1

あなたはこれらの変更を行い、あなたのPublisherThreadクラスで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"); 
     } 
    } 
} 

を使用して試すことができます:

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(); 
    } 
} 
関連する問題