2011-12-08 11 views
2

私は再生1.2.4を使用しています。単体テストを設定してジョブをテストしようとしています。 私のジョブは2秒ごとに実行され、いくつかの条件に基づいて特定のオブジェクトのステータスが変更されます。これが私がこれをするのに使うものです。スレッドをブロックせずに単体テストを一時停止する方法はありますか?

@Every("2s") 
public class GameScheduler extends Job { 
    public void doJob(){ 
     //Fetch of object from db and status change based on conditions happens here 
    } 
} 
私のユニットテストでは今

、Iセットアップこれらの条件が、私はテストがセットアップオブジェクトの1つを取得する前に3秒と言う待ってアサートが仕事かどうかを確認するために、その状態に等しいやりたいです...まあ、それは仕事だった。

私は

try { 
    Thread.sleep(3000); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

よう

pause(3000); 

か何かを使用している場合は、テストが停止しますが、仕事も停止。仕事とテストが同じスレッド上にあるようです。仕事を止めることなくテストを一時停止する方法はありますか?コントローラーのawait()メソッドのようなもの

答えて

3

スケジューラーは(フレームワークがそれを処理しているので)動作するはずだからテストする必要はありません。あなたが必要とするのは、doJobメソッドがその作業をしているかどうかだけです。そこに、状況:単純に(あなたのためにそれを実行するためのスケジューラを待たずに)仕事をテストすることは(おそらくすべてとしてこれを読んで)ほとんどのトリックを行うだろうけど

GameScheduler job = new GameScheduler(); 
job.doJob(); 

// assert whatever you want here 
+0

唯一の問題は...直接invokationのための別のスケジューラの実行のために一度、現実チェックmarcospereiraため – mericano1

+0

おかげで二度実行中のジョブである可能性があります。 – Alain

0

:だから、ちょうどこのようなテストを書きます手動で起動する必要がないのは興味深いものです。

たとえば、共通の設定セットを共有するプレイアプリのクラスタがあります。 1つのスレーブで1つの設定を変更します。他のすべての設定はメモを取り、同じ操作を行います。設定がmemcachedに保存されているとしましょう。便利なユニットテストの1つは、Cache.setを使用して手動で設定を変更し、configurationObserverジョブを実行するのにかかる時間を待ってから、内部設定が更新されたことを確認することです。これは、コンフィグレーションなどを更新する一連のジョブがある場合にはさらに役立つでしょう。

これを行うには、DEVモードでの再生が1つのスレッドを使用することを覚えておく必要があります(これは多くのデバッグに役立ちます。この行をapplication.conf:%test.application.mode = prodに追加するだけで、複数のスレッドが作成されます。

後で編集:モードをprodに設定しても、この場合は本当に役立たないようです。何が助けになるのか:「待っている」魔法を使う。

@Test 
public void myTest() { 
    final Lock lock = new ReentrantLock(); 
    final Condition goAhead = lock.newCondition(); 
    /* Here goes everything you need to do before "pausing" */ 
    lock.lock(); 
    try { 
     /** 
     * Set whatever time limit you want/need 
     * You can also use notifiers like goAhead.signal(), from within another thread 
     */ 
     goAhead.await(5, TimeUnit.SECONDS); 
    } catch (InterruptedException e) { 
     assertTrue(whateverINeedToTest); 
    } finally { 
     lock.unlock(); 
    } 
} 
関連する問題