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

完成!

 

posted @ 2013-01-11 16:23  三句对白  阅读(8862)  评论(1编辑  收藏  举报