2011-08-06 6 views
1

Javaの並行性が新しくなりました。私はJunitを使ってコードをテストしましたが、結果は変です。 JUnit(Eclipse)で実行すると、以下のコードスニペットはコンソールに何も書き込まれません。JUnitの奇妙な動作でマルチスレッドコードをテストする

@Test 
public void testGetNameWithMultithreading() { 

    // code to create IndexFile and DictionaryFile... 
    ... 
    Thread taskOne = new GetNameTask(packOneIndex, packOneDict); 
    Thread taskTwo = new GetNameTask(packTwoIndex, packTwoDict); 
    taskOne.start(); 
    taskTwo.start(); 
} 

私はメインメソッドで実行する場合は、それが動作:

// Switch to test with good-old main method. 
public static void main(String args[]) { 

     // code to create IndexFile and DictionaryFile... 
     ... 
     Thread taskOne = new GetNameTask(packOneIndex, packOneDict); 
     Thread taskTwo = new GetNameTask(packTwoIndex, packTwoDict); 
     taskOne.start(); 
     taskTwo.start(); 
} 

そして、これは、タスクです:

public class GetNameTask extends Thread { 

    public GetNameTask (IndexFile indexFile, DictionaryFile dictFile) { 
     this.dictFile = dictFile; 
     this.indexFile = indexFile; 
    } 

    @Override 
    public void run() { 
     Dictionary dictionary = new DICTDictionary(indexFile, dictFile); 
     System.out.println(dictionary.getName()); 
    } 

    private final IndexFile indexFile; 
    private final DictionaryFile dictFile; 
} 

DICTDictionaryを構築する場合、IOのチェーンがありますファイルから辞書の名前を取得する操作。

マルチスレッドを使用してIOコードを実行することは、JUnitでは機能しない可能性がありますか?

EDIT:これを動作させる方法を見つけました。 JUnitは単一のスレッドでテストを実行するので、2つの小さなスレッドをJUnitスレッドに参加させて、期待される結果を得る必要があります。だから、これはうまくいく。

@Test 
public void testGetNameWithMultithreading() { 

    // code to create IndexFile and DictionaryFile... 
    ... 
    Thread taskOne = new GetNameTask(packOneIndex, packOneDict); 
    Thread taskTwo = new GetNameTask(packTwoIndex, packTwoDict); 
    taskOne.start(); 
    taskTwo.start(); 
    try { 
     taskOne.join(); 
     taskTwo.join(); 
    } catch (InteruptedException ie) { 
     ie.printStackTrace(); 
    } 
} 

JUnitを用いたmultitheadingコードをテストするための任意の簡単な方法はありますか?

よろしくお願いいたします。

+0

あなたはこれに興味があるかもしれません:http://stackoverflow.com/questions/12159/how-should-i-unit-test-threaded-code – Grundlefleck

答えて

2

テストメソッドは、スレッドが完了するまで実行をブロックする必要があります。

ThreadPoolの使用を検討してください。 ExecutorService.awaitTeminationもっと見る...

+0

ありがとう、私はそれを試しています。 – Genzer

2

JUnitはスレッドを正しく扱っていないことで有名です。

私はTestNGを使用して作業することしかできませんでした。私はスイッチをお勧めしたい。これは、別の@Testアノテーションのインポートと、CLASSPATH内の新しいJARを意味するはずです。

+2

はい、TestNGで行う必要があるのは、あなたのテストを通常の方法で書いて、testng.xml内のスレッドでTestNGを実行するように指示するだけです。また、@Test(threadPoolSize = 10、invocationCount = 10000)を持つスレッドで個別のメソッドを実行することもできます。 http://testng.org –

+1

セドリック・バーストは、知らない人たちのためのTestNGの作成者です。素晴らしいもの。 – duffymo