私は、異なるスレッドがHashMapを操作するコードを持っています。 このコードを同期させる必要があります。 後でJUnitを使ってテストしたいと思います。 JUnitを使用してマルチスレッドをテストすることは可能ですか? はいの場合は、私に例を挙げてください。JUnitを使用してマルチスレッドをテストすることは可能ですか?
4
A
答えて
2
もちろん、簡単ではありません。
Freeman & Pryceの"Growing Object Oriented Software"本でこのトピックに関する優れた章がありますが、これは私が強くお勧めします。
2
私はこれを実際に行ったことがありますが、単純なマルチスレッドのシナリオの場合に限ります。基本的に、あなたが望むのは、複数のスレッドのアクセスをハッシュマップに同期させることです。言い換えれば、ハッシュマップ上のスレッドの束が予測可能な順序になるようにすることです。それぞれのスレッドが何かを実行するたびに、各スレッドがナノタイムといくつかの一意のIDにログインし、これらのログエントリに対してアサーションを持つテストケースを構築することができます(memroyに保持することができます。実際のファイル)が正しい順序であるかどうかをチェックします。
はここでどのようにユニットテスト、複数の彼らは、私は彼らがそれを行うことを期待するためにそれを行うことを確認するために、データベースにアクセスするスレッド(だけでなく、実際に、それはちょうど2です)の例です:
@Test
public void testPessimisticLock3_write_blocking() throws Throwable {
init();
final ArrayList<String> eventsOrder = new ArrayList<String>();
Department d = new Department();
d.setName("d");
em.getTransaction().begin();
em.persist(d);
em.getTransaction().commit();
id=d.getId();
em.getTransaction().begin();
//aquire lock:
@SuppressWarnings("unused")
Department dRet1 = em.find(Department.class, d.getId(),LockModeType.PESSIMISTIC_WRITE);
eventsOrder.add("First transaction got the lock");
// dRet1.setName( "dRet1");
eventsOrder.add("First transaction will sleep for a while...");
Thread.sleep(1500);
new Thread(new Runnable() {
@Override
public void run() {
em2.getTransaction().begin();
//this will wait for the first transaction to release the lock, so that this 2nd transaction can acquire the lock
eventsOrder.add("Second transaction will now try to get the lock...");
em2.find(Department.class, id,LockModeType.PESSIMISTIC_WRITE);
eventsOrder.add("Second transaction got the lock.");
em2.getTransaction().commit();
assertEquals("First transaction got the lock",eventsOrder.get(0));
assertEquals("First transaction will sleep for a while...",eventsOrder.get(1));
assertEquals("Second transaction will now try to get the lock...",eventsOrder.get(2));
assertEquals("First transaction woke up and will commit...",eventsOrder.get(3));
assertEquals("First transaction has commited.",eventsOrder.get(4));
assertEquals("Second transaction got the lock.",eventsOrder.get(5));
}
}).start();
Thread.sleep(1500);
eventsOrder.add("First transaction woke up and will commit...");
em.getTransaction().commit();
eventsOrder.add("First transaction has commited.");
}
関連する問題
- 1. antビルドスクリプトでjunitテストをスキップすることは可能ですか?
- 2. ||を使用することは可能ですか? Javaコードのjunitテスト内の演算子ですか?
- 3. Pythonベースのユニットテストフレームワークとランナーを使用してCコードをテストすることは可能ですか?
- 4. JUnitテストでJavassistを使用する
- 5. レコードをレコード要素として使用することは可能ですか?
- 6. エンティティをデータコントラクトとして使用することは可能ですか?
- 7. nunitテストをパラメータ化することは可能ですか
- 8. JUnitテストケースをEclipe内のテスト対象クラスと同期させることは可能ですか?
- 9. encodeObjectを使用してUIPickerViewをアーカイブすることは可能ですか?
- 10. TypeScriptを使用してjQuery.fn.extendをモデル化することは可能ですか?
- 11. スプリングを使用してURLをリダイレクトすることは可能ですか
- 12. indexOfを使用してセレクタを取得することは可能ですか?
- 13. JSONを使用してファイルを送信することは可能ですか
- 14. FQLを使用してfriends.getMutualFriendsを実装することは可能ですか?
- 15. xulでjqueryを使用することは可能ですか?
- 16. BackJone.jsでExtJSを使用することは可能ですか?
- 17. ライブラリでThreadPoolを使用することは可能ですか?
- 18. ORをSelenium.Clickで使用することは可能ですか?
- 19. cでシリアルポートクラスを使用することは可能ですか?
- 20. vimをマウスで使用することは可能ですか
- 21. スクリプトコンポーネントでOleDbConnectionsを使用することは可能ですか?
- 22. C++でアプレットを使用することは可能ですか
- 23. Eigenをcで使用することは可能ですか?
- 24. UIWebViewでiframeを使用することは可能ですか?
- 25. iOSでTTSを使用することは可能ですか
- 26. CallerMemberNameAttributeをfで使用することは可能ですか?
- 27. WIXを使用してCrystal Reportsを機能としてインストールすることは可能ですか
- 28. バルブローダーを使用してBlobstoreにアップロードすることは可能ですか
- 29. CMYKカラーピッカーを使用することは可能ですか?
- 30. Spring MVC + PrimeFacesを使用することは可能ですか?