1

javafx.concurrent.Task を拡張するタスク クラスをテストしたいと思います。call メソッドをオーバーライドしました。

   public class myTask extends Task<Void> {
     @Override
     protected Void call() throws Exception {
       while(!isCancelled()){
         doSth();
       }
       return null;
     }
   }

次に、JUnit テストでそのメソッドの呼び出しをテストします。

public class MyTaskTest {
   @Test
   public void testCall() throws Exception {
     MyTask task = new MyTask();
     Thread th = new Thread(task);
     th.start();
     //.... further validation
   }
}

しかし、それは何もしません。開始されたスレッドでは call メソッドの実行はありません。誰かがなぜそうなのか説明できますか?

4

1 に答える 1

1

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);
}
于 2012-07-25T16:42:11.447 に答える