JUnit テストは、タスク スレッドが必要なことを実行するのを待たず、JUnit スレッドが完了するとすぐに終了します。簡単な例で動作を確認できます。
テスト済みクラス:
public class Test1 implements Runnable {
@Override
public void run() {
System.out.println("I'm tired");
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
}
System.out.println("I'm done sleeping");
}
}
テスト クラス:
public class Test1Test {
@Test
public void testRun() {
Test1 task = new Test1();
Thread th = new Thread(task);
th.start();
boolean yourTestedStuff = true;
assertTrue(yourTestedStuff);
}
}
テストを実行すると、「疲れました」のみが出力され、「寝終わりました」は出力されないことがわかります (スレッドのインターリーブ方法によっては、「疲れています」も出力されない場合があります)。
あなたができることは、たとえば、CountDownLatch を介して、jUnit スレッドとの何らかの形式の同期を使用して、実行可能ファイルにタスクをラップすることです。たとえば、次のようになります。
@Test
public void testRun() throws InterruptedException {
final CountDownLatch latch = new CountDownLatch(1);
final Test1 task = new Test1();
Runnable r = new Runnable() { //wrap your task in a runnable
@Override
public void run() {
task.run(); //the wrapper calls you task
latch.countDown(); //and lets the junit thread when it is done
}
};
Thread th = new Thread(r);
th.start();
assertTrue(latch.await(1000, TimeUnit.SECONDS)); //force junit to wait until you are done
boolean yourTestedStuff = true;
assertTrue(yourTestedStuff);
}