今天测试SimpleDateFormat时用到多线程,但最初Junit并不理想,Mark一下。
Junit多线程测试如下,直接run会发现程序没有任何异常,但debug时SimpleDateFormatUtil却ParseException异常,说明Junit在多线程下Test是有bug的。【SimpleDateFormatUtil为Date解析工具类】
@Test
public void threadTest()
{
for (int i =
0; i < 3; i++)
{
new SimpleThread().start();
}
}
private static class SimpleThread extends Thread
{
@Override
public void run()
{
try {
System.out.println(this.getName()
+ ":" + SimpleDateFormatUtil.parse("2015-12-23
15:00:00"));
} catch (ParseException e)
{
e.printStackTrace();
}
}
}
在多线程环境下,程序退出的条件是,所有的非Daemon线程都正常结束或者某个线程条用了system.exit方法,导致进程强行退出。
JunitCore类的main函数如下:
public static transient void main(String
args[]){
runMainAndExit(new RealSystem(),
args);
}
private static transient void runMainAndExit(JUnitSystem
system, String args[]){
Result
result = (new JUnitCore()).runMain(system,
args);
System.exit(result.wasSuccessful() ? 0 : 1);
}
很明显,其调用了System.exit函数,将导致线程结束,而多线程甚至都来不及运行。
那么,我们该如何在多线程先进行Junit测试呢?【用main函数测试也是OK的】
@Test public void threadTest() throws Throwable { TestRunnable[] testRunnables = new TestRunnable[NUM_THREAD]; for (int i = testRunnables[i] } final MultiThreadedTestRunner multiThreadedTestRunner = new MultiThreadedTestRunner(testRunnables); multiThreadedTestRunner.runTestRunnables(); }
private static class SimpleThread extends TestRunnable { @Override public void runTest() try { System.out.println(this.toString() // } catch (ParseException e) e.printStackTrace(); } } } |