今天測試的時候碰到一個多線程測試的問題。
問題描述: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(); } }
完成!