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

    完成!

  • 相关阅读:
    FreeMarker中List排序
    Mingyang.net:为什么不将Bean定义在Action参数中?
    长春市学校标识码
    java解析html的table
    java发送http的get、post请求【备忘】
    CentOS安装CAS 5.3.4服务端
    设置JAVA环境变量
    CentOS安装Maven
    为tomcat8安装Native library
    openresty用naxsi防xss、SQL注入
  • 原文地址:https://www.cnblogs.com/charlexu/p/2856643.html
Copyright © 2020-2023  润新知