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();
        }
        
    }
    

完成!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM