我有一段代码,其中不同的线程操纵HashMap。 我必须同步这段代码。 后来我想用JUnit测试一下。 那么是否有可能使用JUnit测试多线程? 如果可以,请给我一个例子。是否有可能使用JUnit测试多线程?
4
A
回答
2
绝对,但这并不容易。
在Freeman & Pryce的"Growing Object Oriented Software"这本书里有很棒的一章,我强烈推荐这本书。
2
我已经这样做了,但只适用于简单的多线程场景。基本上,你想要的是将多个线程的访问同步到你的散列映射,或者换句话说,有一个可预测的顺序,在散列映射上有一堆线程。您可以构建测试用例,其中每个Thread都记录了纳米级别,并在每次执行某些操作时创建一些唯一的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. 使用Junit测试线程
- 2. JUnit线程测试
- 3. 是否有可能以编程方式生成JUnit测试用例和套件?
- 4. Hibernate + JUnit多线程集成测试
- 5. 是否有可能使用junit和mockito创建嵌套单元测试?
- 6. 是否可以重置JUnit测试?
- 7. JUnit,测试和线程
- 8. 有线JUnit测试断言
- 9. JUNIT有条件测试可能吗?
- 10. JUnit框架是否有测试?
- 11. 是否可以在JUnit测试中使用java.lang.instrument.Instrumentation?
- 12. 是否可以使Eclipe中的测试类与JUnit测试用例同步?
- 13. 是否有可能测试身体
- 14. 是否有可能嘲笑被测试
- 15. 逃离JUnit测试用例可能吗?
- 16. 是否可以执行单元测试的多线程?
- 17. 是否有可以运行多线程以利用多核机器的.NET测试的测试运行器?
- 18. JUnit测试 - 是否需要调用JUnitCore.main()?
- 19. 是否可以使用单个测试测试多个类
- 20. 是否可以使用espresso测试记录器测试多个应用程序?
- 21. 是否有可能使用pyunit动态加载测试用例
- 22. 是否有可能测试飞镖列表是否可增长?
- 23. 多线程性能和性能测试
- 24. 测试使用JUnit
- 25. 测试使用JUnit
- 26. 我可以在Junit测试中检测泄漏的线程吗?
- 27. 是否有可能与多线程执行JavaScript功能
- 28. Junit使用数据库访问测试多线程应用程序
- 29. 是否有可能编写与您的JAX-RS实现无关的JUnit测试?
- 30. 是否有可能要求junit在做测试之前运行规定脚本?