10

次のような関数があります。

private Timer timer = new Timer();

private void doSomething() {
    timer.schedule(new TimerTask() {
        public void run() {
            doSomethingElse();
        }
    },
    (1000));
}

コードの JUnit テストを作成しようとしていますが、特にこのコードをテストするときに期待どおりに動作しません。EclEmma を使用することで、テストがdoSomethingElse()関数に触れていないことがわかります。

TimerTaskテストを続行する前に終了するのに十分な時間待機する JUnit でテストを作成するにはどうすればよいですか?

4

3 に答える 3

5

JUnit は、実際にはマルチスレッド コードを実行するようには設定されていません。メインスレッドが終了すると、他のすべてのスレッドが停止します。TimerTaskつまり、スレッド スケジューラが、メソッドから戻る前に新しいスレッドを実行しているスレッドにコンテキストを切り替えない場合、@Testそのスレッドを強制終了して JVM を終了するだけなので、メソッドは実行されません。

Thread.sleep(long)ステファンが提案したようなものを配置するか、別のデザインを使用することができます。おそらく、タイムアウト値を使用ScheduledThreadPoolExecutorできる場所です。awaitTermination

于 2013-11-03T13:07:18.613 に答える