Java多线程单元测试
今天测试的时候碰到一个多线程测试的问题。
问题描述:class(ChildThread)继承Thread,方法run是一个循环,循环的break条件是在方法childThreadStop中判断。
public class ChildThread extends Thread{ ... private boolean alive_flag; public void run(){ alive_flag = true; While(alive_flag){ ... } public void childThreadStop(){ alive_flag = false: } }
由于方法run中有一些其他的class,需要Mock掉,但是在PowerMock中不能新建一个Thread来使用Thread.start()。所以必须另想方法。
在网上找了下,上面说有一个多线程测试"Unit Test for Multi-Thread",但是路径一直不对。不知道什么原因。
后来又找了个"GroboUtils",这个是可以的,而且也很简单。
@Test public void testrun() throws Throwable{ //略...... //注意:由于是使用两个线程使用同一个对象,所以Mock的方法需要使用PowerMock.expectLastCall().atLeastOnce(); ChildThread mockChildThread = PowerMock.createPartialMock( ChildThread.class, ..... ); PowerMock.replayAll(); TestRunnable tr = new TransferThread( mockChildThread ); TestRunnable tr2 = new TransferThread2( mockChildThread ); TestRunnable[] trs = { tr, tr2 }; MultiThreadedTestRunner mttr = new MultiThreadedTestRunner(trs); mttr.runTestRunnables(); PowerMock.verifyAll(); } //第一个线程启动测试方法run private static class TransferThread extends TestRunnable{ private ChildThread childThread; public TransferThread(ChildThread childThread){ super(); this.childThread = childThread; } @Override public void runTest() throws Throwable { childThread.run(); } } //第二个线程sleep一段时间后,关闭Thread private static class TransferThread2 extends TestRunnable{ private ChildThread childThread; public TransferThread2(ChildThread childThread){ super(); this.childThread = childThread; } @Override public void runTest() throws Throwable { Thread.sleep( 100 ); childThread.childThreadStop(); } }
完成!