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コードをテストするための任意の簡単な方法はありますか?
よろしくお願いいたします。
あなたはこれに興味があるかもしれません:http://stackoverflow.com/questions/12159/how-should-i-unit-test-threaded-code – Grundlefleck